Linuxでは、「本当のファイル」と「仮想ファイル」をどのように読みますか?

Linuxでは、「本当のファイル」と「仮想ファイル」をどのように読みますか?

Linuxには「実ファイル」と「仮想ファイル」があり、実際のファイルはハードディスクに常駐するファイルであり、仮想ファイルはカーネルがファイル形式で表現するデータだけであることがわかりました。

たとえば、/procディレクトリ内のファイルは仮想ファイルです。

私はこのような関数がread()実際のファイルを読み取る方法と仮想ファイルを読み取る方法をどのように知っているかを理解したいと思います。このトピックの理解を示すために、次の画像を作成しました。理解が間違っている場合は訂正してください。

ここに画像の説明を入力してください。

ベストアンサー1

VFS層では、すべてのファイルは仮想です(実際には、SunOSエンジニアがUFS(ディスクベース)ファイルとNFS(ネットワークベース)ファイルシステムを組み合わせるために発明しました)。

各オープンには、共通ルーチンの実装を提供するfile関数テーブルがあります(一部は一般的な場合があります)。それぞれには、必要な実装を含むC関数テーブル()を持つリンクオブジェクトがあります。順序は次のとおりです。f_opinodeaddress_spacea_ops

  1. sys_read():アプリケーションはシステムコールを使用してファイルの読み取りを開始します。
  2. 呼び出しはVFSスタックの一番上に転送されます(vfs_read())。
  3. file->f_op->read()またはdo_sync_read()または を使用して、呼び出しをファイルシステムドライバに転送します。new_sync_read()
  4. ファイルを直接入出力モードで開くと、対応する関数(a_ops->direct_IO()ext4_direct_IO()for ext4)が呼び出され、データが返されます。
  5. ページキャッシュでページが見つかるとデータが返されます。 file_get_page()
  6. ページキャッシュにページが見つからない場合は、from ドライバによって実装されたa_ops->readpage()ファイルシステムからページを読み込みます。ext4_readpage()ext4
  7. VFS スタックは、次のコマンドを使用してブロック入力および出力要求を生成します。submit_bio()

~からhttp://myaut.github.io/dtrace-stap-book/kernel/fs.html、この記事を書いた後、VFSスタックが少しリファクタリングされたので少し古いです。

おすすめ記事