
答え1
VFS層では、すべてのファイルは仮想です(実際には、SunOSエンジニアがUFS(ディスクベース)ファイルとNFS(ネットワークベース)ファイルシステムを組み合わせるために発明しました)。
各オープンには、共通ルーチンの実装を提供するfile
関数テーブルがあります(一部は一般的な場合があります)。それぞれには、必要な実装を含むC関数テーブル()を持つリンクオブジェクトがあります。順序は次のとおりです。f_op
inode
address_space
a_ops
sys_read()
:アプリケーションはシステムコールを使用してファイルの読み取りを開始します。- 呼び出しはVFSスタックの一番上に転送されます(
vfs_read()
)。 file->f_op->read()
またはdo_sync_read()
または を使用して、呼び出しをファイルシステムドライバに転送します。new_sync_read()
- ファイルを直接入出力モードで開くと、対応する関数(
a_ops->direct_IO()
、ext4_direct_IO()
forext4
)が呼び出され、データが返されます。 - ページキャッシュでページが見つかるとデータが返されます。
file_get_page()
- ページキャッシュにページが見つからない場合は、from ドライバによって実装された
a_ops->readpage()
ファイルシステムからページを読み込みます。ext4_readpage()
ext4
- VFS スタックは、次のコマンドを使用してブロック入力および出力要求を生成します。
submit_bio()
~からhttp://myaut.github.io/dtrace-stap-book/kernel/fs.html、この記事を書いた後、VFSスタックが少しリファクタリングされたので少し古いです。
答え2
私はこれについて何らかの方法で完全な答えを提供しません...
1つの重要な分離を除いて、基本的にあなたは正しいです。読む()尋ねたコアファイル記述子には何が含まれていますか?コア残りはよく処理してください。物理ファイルシステムなのか、ネットワークファイルシステムなのか、仮想ファイルシステム(/proc、/sys、...)なのか読む()。カーネルには、要求を処理または提供しない基本コードがあり、これをドライバと呼びます。