1. ホーム
  2. オペレーティングシステム
  3. ユニックス/BSD

Unixファイルシステムおよびpwdコマンドの実装詳細

2022-01-16 04:59:15

1. ユーザーにとって、Unix システムのハードディスク上のファイルはディレクトリツリーを形成しています。各ディレクトリには、ファイルや他のサブディレクトリを含めることができます。

ディレクトリツリーの深さにはほとんど制限はありませんが、あまりに深いディレクトリツリーを作成すると、範囲外であることを警告して実行を停止します。

真の間

する

mkdir deep_well

cd deep_well

完了

数秒間実行したところ、ディレクトリツリーの範囲を超えているとして、割り込みシステムがプロンプトを表示しました。

2. ディスクはN個のセクタに分割することができ、各セクタは512バイトである。セクタはディスクの基本的な記憶単位であり、各セクタに番号を振って、ディスクは次のようになる。

番号が振られたブロックの連続。

3. ディスクブロックにファイルを格納する場合、一定のパターンに従って格納される。

ファイルシステムは、スーパーブロック、i-nodeテーブル、データエリアの3つの部分に分かれています。

スーパーブロック:各領域のサイズや、未使用のディスクブロックの情報など、ファイルシステム自体の情報を保持します。(バージョンによって若干異なる)

i-nodeテーブル。各ファイルはその属性、サイズ、最終修正時刻などをino_t構造体に格納しており、すべてのi-nodeは同じサイズである。

(テーブルの各i-nodeはその位置によってマークされ、例えば2とマークされたi-nodeはファイルシステムのi-nodeテーブルの3番目に位置する)

データブロック : ファイルの内容を保持する。ブロックの大きさは一定であるため、1つのファイルが複数のディスクにまたがっていることもある。

4. ファイルを作成する4つのステップ

属性の保存:カーネルはまず空のi-nodeを見つけ、ファイルの属性に関する情報でそれを埋める。

データを格納する:ディスクから空きブロックを探し、そこにファイルデータをコピーする。

割り当ての記録:カーネルはi-nodeのディスク分配領域にちょうどディスク番号を記録する

ディレクトリにファイル名を追加:(i-node番号, ファイル名)をディレクトリに追加する。

5. catやmoreなど、いくつかのコマンドを実装することです。

猫名

ディレクトリ内のファイル名を検索する

対応するファイル名のi-node番号を探す。

中のi-node番号に従ってファイルの属性を取得し、パーミッションをチェックし、パーミッションが十分でない場合、open()関数は1を返し、オープンに失敗し、停止します。

i-node内のディスク位置に応じて、ファイル位置のデータブロックにアクセスします。

readを何度も呼び出してデータを読み込む(バッファに格納可能)

6. 大容量ファイルの保存

あるファイルの保存に14個の番号付きディスクブロックが必要だが、i-nodeの値には13個の項目の割り当てチェーンテーブルが含まれているとすると、最初の10個をi-nodeに入れ、残りの4個をi-nodeの最初のデータブロックに入れます。

i-nodeの11ビットは、その4つの数字を保持するブロックに書き込まれます。そして、実際には10+4+1個のデータブロックを使用し、余分な1個は間接ブロックと呼ばれます。

同様に、間接ブロックが飽きたら、第二の間接ブロックを設定すればいいわけで...。

7. ディレクトリ内のファイルの意味

ディレクトリには(i-node番号, ファイル名)のエントリが含まれる。つまり、ディレクトリにはファイルへの参照が含まれ、各アプリケーションはリンクと呼ばれる。

8. サブディレクトリを含むディレクトリの意味

ディレクトリには、サブディレクトリのi-nodeへのリンクが含まれています。

9. ディレクトリが親を持つことの意味。

ディレクトリには、親ディレクトリへのリンクである.が含まれています。

10. ファイルは名前を持たず、i-node番号のみを持つが、リンクは名前を持つことができ、1つのファイルは複数のリンクを持つことができる(それらの名前は異なっていても良いが、それらは1つのファイルを指しており、それらに対する操作はソースファイルに対する操作である)。

11. Unixシステムは複数のファイルシステムを含むことができ、それぞれがルートディレクトリを持つ独立したツリーですが、システムはそれらを1つの大きなツリーに統合することができます、つまり、あるツリーのルートが別の番号のあるノードにロードされます。

12 シンボリックリンクは、ファイルシステム全体またはディレクトリに対して、ファイル名でファイルを参照します。ウィンドウズでいうショートカットに相当する。

ハードリンクは、ディレクトリとツリーをリンクさせるポインターであると同時に、ファイル名とファイル自身をリンクさせるポインターでもある。ファイルはi-node番号の組で参照される。

13 . ディレクトリツリーに関連するコマンドとシステムコール

コマンド mkdir

実装ヘッダーファイル #include #インクルード <シス

関数プロトタイプ[...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...] [...]