web-dev-qa-db-ja.com

Linuxでファイルシステムドライバードライバーを実装するにはどうすればよいですか?

新しいファイルシステムを発明し、今それのためのファイルシステムドライバを作成したいとします。

このファイルシステムドライバーはどのように実装しますか?これはカーネルモジュールを使用して行われますか?

また、ファイルシステムドライバーはどのようにしてハードディスクにアクセスできますか?ファイルシステムドライバーにはハードディスクにアクセスするためのコードが含まれていますか?Linuxにはすべてのファイルシステムドライバーが使用するハードディスクにアクセスするためのデバイスドライバーが含まれていますか?

15
user343344

はい、Linuxのファイルシステムはカーネルモジュールとして実装できます。しかし、Fuse(USErspace内のファイルシステム)インターフェースもあり、通常のユーザースペースプロセスをファイルシステムドライバーとして機能させることができます。新しいファイルシステムのプロトタイプを作成している場合、最初にFuseインターフェースを使用して実装すると、テストと開発が容易になります。ファイルシステムの内部がFuse形式で作成されたら、パフォーマンスが最適化されたカーネルモジュールバージョンのファイルの実装を開始できます。

これは、カーネル空間内でのファイルシステムの実装に関するいくつかの基本的な情報です かなり古い(1996年からです!)あなたがする必要がある種類の事。

Fuseルートに移動することを選択した場合、 libfuseは、Fuseインターフェースのユーザースペース側のリファレンス実装です

カーネルモジュールとしてのファイルシステムドライバー

基本的に、ファイルシステムドライバーモジュールの初期化関数は、register_filesystem()関数を呼び出し、パラメーターとして、ファイルシステムドライバー内で使用される関数を識別する関数ポインターを含む構造体を与える必要があります。ファイルシステムのタイプを識別してマウントする最初のステップ。その段階ではこれ以上何も起こりません。

ファイルシステムがマウントされ、ファイルシステムタイプがドライバーと一致するように指定されているか、ファイルシステムタイプの自動検出が実行されている場合、カーネルの仮想ファイルシステム(略してVFS)レイヤーがその関数を呼び出します。基本的には、「標準のLinuxブロックデバイスのカーネルレベルの表現へのポインタです。これを見て、処理できるものかどうかを確認し、それで何ができるかを教えてください」と書かれています。

その時点で、ドライバーはファイルシステムに適切なドライバーであることを確認するために必要なものをすべて読み取り、ドライバーがその特定のファイルシステムで実行できるその他の機能へのポインターを含む構造を返します。または、ファイルシステムドライバーがディスク上のデータを認識しない場合、適切なエラー結果を返すはずであり、VFSはユーザースペースに障害を報告するか、または-ファイルシステムタイプの自動検出が実行されている場合-別のファイルシステムに問い合わせます試すドライバー。

カーネル内の他のドライバーは標準ブロックデバイスインターフェイスを提供するため、ファイルシステムドライバーはハードウェアサポートを実装する必要がありません。基本的に、ファイルシステムドライバーは、デバイスポインターが指定された標準のカーネルレベルの関数を使用して、ディスクブロックを読み書きできます。

VFSレイヤーは、ファイルシステムドライバーがVFSレイヤーで利用可能ないくつかの標準機能を作成することを期待しています。これらのいくつかは、VFSレイヤーがファイルシステムで意味のあることを行うために必須であり、その他はオプションであり、そのようなオプションの関数へのポインターの代わりにNULLを返すことができます。

24
telcoM

はい、カーネルドライバーはファイルシステムを管理できます。

モックアップ、ファイルシステムのプロトタイプを作成する最良のソリューションは、Fuseを使用することです。そして、それをカーネルドライバーに変換することを考えることができます。

ウィキペディア=>https://en.wikipedia.org/wiki/Filesystem_in_Userspace

ソース=>https://github.com/libfuse/libfuse

チュートリアル=>https://developer.ibm.com/articles/l-Fuse/

5
EchoMike444

はい、これは通常、カーネルモジュールとしてロードするか、カーネルにコンパイルできるカーネルドライバを使用して行われます。

同様のファイルシステムドライバーとその動作を確認できます ここ

これらのドライバーは、内部カーネル関数を使用してバイトのブロックとしてストレージデバイスにアクセスしますが、 ブロックデバイス および キャラクターデバイス フォルダー内のドライバーによって公開されたブロックデバイスを使用することもできます。

0
Erik

Fuseを使用して、ユーザーランドファイルシステムを作成したり、カーネルモジュールを作成したりできます。言語を選択できるため、Fuseを使用する方が簡単で、カーネル(したがってシステム全体)をクラッシュさせることもありません。

カーネルモジュールの方が高速ですが、最適化の最初のルールは、動作するコードをテストするまで行わないでください。もう1つはそのようなものです。遅すぎるという証拠が見つかるまで実行しないでください。そして3つ目:それがより速く/より小さくするという証拠がない限り、それを保持しないでください。

そして、はい、カーネルにはハードウェア用のドライバーが既にあります。それらを再実装する必要はありません。

0
ctrl-alt-delor