私は新しいファイルシステムを開発し、それを行うためのファイルシステムドライバを作成したいとしましょう。
このファイルシステムドライバをどのように実装しますか?カーネルモジュールを使って行われますか?
ファイルシステムドライバはどのようにハードドライブにアクセスしますか?ファイルシステムドライバにハードドライブにアクセスするためのコードを含める必要がありますか?または、Linuxには、すべてのファイルシステムドライバが使用するハードドライブにアクセスするためのデバイスドライバが含まれていますか?
ベストアンサー1
はい、Linuxのファイルシステムはカーネルモジュールとして実装できます。ただし、通常のユーザースペースプロセスがファイルシステムドライバとして機能することを可能にするFUSE(Filesystem in USERspace)インターフェイスもあります。新しいファイルシステムのプロトタイプを作成する場合は、最初にFUSEインタフェースを使用して実装することでテストと開発が容易になります。 FUSEの形式でファイルシステムの内部問題を解決したら、パフォーマンスに最適化されたカーネルモジュールバージョンの実装を開始できます。
以下は、カーネル空間にファイルシステムを実装するための基本的な情報です。かなり古いものです(1996年から!)。しかし、これは少なくともあなたが何をすべきかについての基本的なアイデアを提供します。
FUSEパスを選択した場合、これは、FUSEインターフェースのユーザースペース側の参照実装であるlibfuseです。
カーネルモジュールとしてのファイルシステムドライバ
基本的に、ファイルシステムドライバモジュールの初期化関数は、関数の呼び出しとregister_filesystem()
識別に使用されるファイルシステムドライバの関数を識別する関数ポインタを含む引数で構造を提供するだけです。システムはこれを入力してマウントすることです。この段階では、これ以上何も起こりません。
この関数は、ファイルシステムがマウントされているとき、ファイルシステムタイプがドライバと一致するように指定されたとき、またはファイルシステムタイプが自動検出されると、カーネルの仮想ファイルシステム(VFS)層によって呼び出されます。基本的に、「ここでは標準のLinuxブロックデバイスのカーネルレベル表現へのポインタがあります。これを見て、処理できるものがあることを確認し、それを使って何ができるかを教えてください」と言います。
この時点で、ドライバはファイルシステムの正しいドライバであることを確認するために必要なすべてを読み、ドライバが特定のファイルシステム関数ポインタに対して実行できる追加の操作へのポインタを含む構造体を返す必要があります。または、ファイルシステムドライバがディスク上のデータを認識しない場合は、適切なエラー結果を返す必要があります。システムドライバを試してください。 。
カーネルの他のドライバは標準ブロックデバイスインタフェースを提供するため、ファイルシステムドライバはハードウェアサポートを実装する必要はありません。デフォルトでは、ファイルシステムドライバは、標準のカーネルレベル機能と、ここに提供されているデバイスポインタを使用してディスクブロックを読み書きすることができます。
VFS層は、ファイルシステムドライバがVFS層に複数の標準機能を提供すると予想しています。これらのいくつかは、VFS層がファイルシステムで意味のある操作を実行するために必要であり、他のものはオプションであり、代わりにNULLを返すことがあります。このクラスを指すオプション関数へのポインタです。