はい、Linuxのファイルシステムはカーネルモジュールとして実装できます。ただし、FUSE(USErspaceのファイルシステム)インターフェイスもあり、通常のユーザー空間プロセスをファイルシステムドライバーとして機能させることができます。新しいファイルシステムのプロトタイプを作成している場合、最初にFUSEインターフェイスを使用して実装すると、テストと開発が容易になります。ファイルシステムの内部をFUSE形式で解決したら、パフォーマンスが最適化されたカーネルモジュールバージョンの実装を開始できます。
カーネル空間内にファイルシステムを実装するための基本情報を次に示します。それはかなり古い(1996年から!)が、少なくともあなたがやらなければならないことの種類についての基本的な考えを与えるはずだ。
FUSEルートへの移動を選択した場合、これはFUSEインターフェイスのユーザースペース側のリファレンス実装であるlibfuseです。
カーネルモジュールとしてのファイルシステムドライバー
基本的に、ファイルシステムドライバーモジュールの初期化関数は、register_filesystem()
関数を呼び出すだけで、ファイルシステムを識別する最初のステップとして使用されるファイルシステムドライバーの関数を識別する関数ポインターを含む構造体をパラメーターとして与えるだけで済みます。タイプして取り付けます。その段階ではこれ以上何も起こりません。
ファイルシステムがマウントされ、ドライバーに一致するファイルシステムタイプが指定されているか、ファイルシステムタイプの自動検出が実行されている場合、カーネルの仮想ファイルシステム(略してVFS)レイヤーがその関数を呼び出します。基本的には「標準のLinuxブロックデバイスのカーネルレベルの表現へのポインターです。それを見て、処理できるものかどうかを確認し、それで何ができるかを教えてください。」
その時点で、ドライバーは、ファイルシステムに適切なドライバーであることを確認するために必要なものをすべて読み取り、その特定のファイルシステムでドライバーが実行できる追加機能へのポインターを含む構造を返します。または、ファイルシステムドライバーがディスク上のデータを認識しない場合、適切なエラー結果を返すことが想定されており、VFSはユーザースペースにエラーを報告するか、またはファイルシステムタイプの自動検出が実行されている場合、別のファイルシステムを要求しますしようとするドライバー。
カーネル内の他のドライバーは標準ブロックデバイスインターフェイスを提供するため、ファイルシステムドライバーはハードウェアサポートを実装する必要はありません。基本的に、ファイルシステムドライバーは、デバイスポインターを指定した標準のカーネルレベルの関数を使用して、ディスクブロックを読み書きできます。
VFSレイヤーは、ファイルシステムドライバーが多くの標準機能をVFSレイヤーで利用できるようにすることを期待しています。これらのいくつかは、VFSレイヤーがファイルシステムで何か意味のあることを行うために必須であり、他はオプションであり、そのようなオプション関数へのポインターの代わりにNULLを返すことができます。