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