web-dev-qa-db-ja.com

非常に単純なファイルシステムを実装する方法は?

OSがハードドライブに対してどのように読み取り/書き込みを行っているのかと思います。
演習として、ファイルを読み書きできるディレクトリのない単純なファイルシステムを実装したいと思います。
どこから始めますか?
C/C++でうまくいくのでしょうか、それともより低レベルのアプローチで行かなければなりませんか?
一人で処理するには多すぎますか?

30
the_drow

Fuseを見てください: http://Fuse.sourceforge.net/

これにより、実際にデバイスドライバーを作成しなくても、ファイルシステムを作成できます。そこから、1つのファイルから始めます。基本的には(たとえば)長さが100MBのファイルを作成してから、そのファイルから読み書きするルーチンを記述します。

結果に満足したら、デバイスドライバーを作成し、ドライバーを物理ディスクに対して実行させることができます。

良い点は、C/C++だけでなく、ほとんどすべての言語をFuseで使用できることです。

18

ファイルシステムのアイデアを学ぶために、私が考えるディスクを使用することは本当に必要ではありません。 512バイトのバイト配列の配列を作成するだけです。これがあなたのハードディスクで少し実験を始めることを想像してみてください。また、 http://codex.cs.yale.edu/avi/os-book/OS8/os8c/index.html のようないくつかの標準的なOSの教科書を見てみたいかもしれません。

8
0x434D53

Avrマイクロコントローラーでファットファイルシステムを使用しているときに、単純なファイルシステムを理解するのは非常に簡単です。

http://Elm-chan.org/fsw/ff/00index_e.html

脂肪がどのように機能するかを理解するコードを見てみましょう。

7
optixx

最初の質問への答えは、他の誰かがあなたに言ったようにFuseのほかに、Windowsで同じことをするDokanを使用することもでき、そこから物理パーティションへの読み取りと書き込みを行うという質問だけです( http://msdn.Microsoft.com/en-us/library/aa363858%28v=vs.85%29.aspx (特に物理ディスクとボリュームのセクションをお読みください)。

もちろん、LinuxまたはUnixでは、Fuseのようなものを使用する以外に、/ dev/xxx(ルートの場合)で目的のデバイスへの読み取りまたは書き込みの呼び出しを発行するだけで済みます。あなたの視点によっては安全ではありません。

そこから、Fatのような単純なファイルシステム、またはtarファイルシステムのようなより風変わりなもの、あるいはUFSやMinuxのようなUnixの概念に基づいたいくつかの単純なファイルシステム、または行われた呼び出しとその引数のみをログに記録するものを実装しようとします。ログファイル(これは、コンピューターの通常の使用中にファイルシステムドライバーに対して行われる呼び出しを理解するのに役立ちます)。

次に、2番目の質問(答えははるかに簡単です)です。はい、C/C++がトリックを実行します。これらはシステム開発の共通言語であるため、多くのサンプルコードはC/C++にあるため、開発中のC/C++を最低限読んでください。

3つ目の質問で、はい、これは1人で実行できます。たとえば、extファイルシステム(Linuxの世界ではext2またはext3として後継者によって広く知られています)は、単一の開発者Theodore Ts'oによって作成されたので、考えないでください。これらのことは一人ではできません。

最後のメモですが、実際のファイルシステムは通常のカーネル内の他の多くのサブシステムと相互作用することを覚えておいてください。たとえば、ラップトップがあり、それを休止状態にしている場合、ファイルシステムは開いているファイルに加えられたすべての変更をフラッシュする必要があります。パーティション上のページファイル、またはページファイルに独自のファイルシステムがある場合でも、ファイルシステム、特にブロックサイズに影響を与えます。なぜなら、それらはページブロックサイズと同じか累乗される傾向があるためです。偶然にページサイズと等しいメモリ上のファイルシステム(これは1回の転送であるため)。

また、セキュリティ。ユーザーとユーザーが読み書きするファイルを制御する必要があるため、通常、ファイルを開く前に、ログオンしているユーザーと、そのファイルに対するユーザーのアクセス許可を知っておく必要があります。そして、明らかにファイルシステムがなければ、ユーザーはプログラムを実行したり、マシンを操作したりできません。最新のファイルシステムレイヤーは、ネットワークファイルシステムと分散ファイルシステムがあるため、ネットワークサブシステムとも対話します。

したがって、カーネルファイルシステムの実行について学びたい場合、それらは(VFSインターフェースを知る以外に)心配する必要があることの一部です。

PS:Unixのアクセス許可をWindowsで機能させる場合は、WindowsのサーバーバージョンでMSがNFSに使用するようなものを使用できます( http://support.Microsoft.com/kb/262965

3
Coyote21

コヨーテ21が言ったことのほんの補足。あなたはこの論文を読むことができます http://www.minix3.org/theses/gerofi-minix-vfs.pdf

この論文では、VFSについてもう少し学ぶことができ、いくつかの詳細がそこで説明されています。付録Bには非常に役立つ情報があります。ファイルシステムの実装があります(実際のファイルシステムではなく、メモリ内にあります)。

2