ファイルシステム(その2)
前回は、Ext2 ファイルシステムにおけるディスク構造について学習した。今回は、ファイルのアドレス変換と、カーネルがディスクデータを操作するためのメモリデータ構造について調べる。
まずは、ファイルデータブロックのアドレス変換について話しをはじめる。
前回の話しからもわかるように、ディスクにファイルというオブジェクトは存在しない。ファイルとは、ファイルシステムが上位レイヤに対してデータブロックを抽象化した論理的な存在である。ファイルという存在は、カーネルから見ると、ファイルはブロック単位に切れ目の入ったデータブロックの集合のように見える。
ユーザーがファイルに対して読み書きを行ったとき、より高位のレイヤ(VFS)では、対象のデータが存在するデータブロックに対して読み書きを行う(*1)。
ここで言っている"データブロック"は、操作しているファイル内における対象データが存在するブロックの位置であり、それがそのままディスクの位置となるわけではない。なぜなら、先にも言ったように、ファイルとはファイルシステムが提供する概念的な存在なので、これにたいして読み書きする為にはこの対象データブロックの位置(アドレス)を、ファイルシステムによって実際に対象データがディスク内に保存されるデータブロックの位置に変換する必要がある。
ここでは、前者を論理ブロック番号、そして後者を実ブロックと呼ぶ。
(*1):正確には、対象のデータが存在するデータブロックをキャッシュしたページキャッシュに対して読み書きを行う。
カーネルが論理ブロック番号を取得するには、読み書きの対象となっている場所のファイル内オフセットをブロックサイズで割った商を求める。
さて、ここで求めた論理ブロック番号を実ブロック番号に変換するファイルシステムの仕組みを図示したものが、以下のサイトから参照できる。
http://opentechpress.jp/kernel/internal24/node106.shtml#SECTION03720000000000000000
既に、サイト作成者の高橋さんによって大まかな説明がなされているが、ここでも簡単に話をする。
ディスクの inode オブジェクトの i_block メンバ(32ビット配列)が、データブロックのアドレッシングを行う主要なデータ構造である。
i_block のインデックスが論理ブロック番号に対応し、先頭から12番目の要素には、直接データブロックのデータ構造が割り当てられ、13番目と14番目においては i_block と同じデータ構造の配列を持っており、その配列の各メンバがデータブロックに対応しており、2段階の配列の参照によってデータブロックを参照する。15番目の要素は、2段階目の各要素において、同一のデータ構造の配列を持ち、3段階の配列の参照によってデータブロックを参照する。
これが、有名なinodeにおけるunixのファイル構造である。このマッピング形態は初期の unix から存在している(らしい)。
- Category(s)
- 学習経過
- The URL to Trackback this entry is:
- http://dev.ariel-networks.com/Members/ohyama/30d530a130a430eb30b730b930c630e0-305d306e2/tbping