Programmer's Note

コード読み書きの備忘録。

UNIX V6 ファイルシステム周りの勉強メモ

UNIX V6はPDP-11という古いDECのミニコンピュータ上で動く。このPDP-11のディスク装置(いわゆる磁気ディスク)は、アクセスの単位がブロックで区切られている。1ブロックは512バイト。

UNIXのファイルは単にバイトの並びでしかなく、ファイル自体に管理用の特別な情報は持たせていない。これをそのまま素直に前から順にディスクに記録すれば良いということだ。シンプルだ。

ただし、ファイルがディスク上のどの場所に保存したかの情報は覚えておかなければいけない。最低限「保存先のブロック番号」と「ファイルサイズ」の情報はどこかに記録しておく必要がある。

UNIX V6では、上記の最低限の2つの情報の他に、パーミッション、ユーザID、グループID、linkが作られた数の情報を持っている。これはOSが実現する機能で参照する情報だ。

これらの情報は以下のinode構造体で管理されている。

inodeの構造体:

struct  inode {
  uint16_t i_mode;     // 状態、制御情報。下位9ビットはパーミッション
  char i_nlink;        // ディレクトリからの参照数(Linkが作られた数)
  char i_uid;          // ユーザID
  char i_gid;          // グループID
  char i_size0;        // ファイルサイズの上位8ビット
  uint16_t i_size1;    // ファイルサイズの下位16ビット
  uint16_t i_addr[8];  // 使用しているストレージのブロック番号
  int16_t i_atime[2];  // 参照時刻
  int16_t i_mtime[2];  // 更新時刻
};

上記inodeのサイズは32バイト。 このinodeの情報は、1ファイルに1つなのだが、ディスクの先頭の方にまとめて配置して管理している。

ブロックデバイスの1ブロックのサイズは512バイトなので、1ブロックに含まれるinodeの数は16個。 (inode管理に何ブロック使うかは、ディスク装置の全体のサイズによるのかな。)

ファイルの情報を得たいときは、ディスクの先頭の方のブロックのinode情報にアクセスすればよい。これは必ずブロック2から格納される約束になっている。 ブロック2の先頭から、inode 1, inode 2, inode 3,,,, と続いていく。

ディスクに保存したファイルのinode番号が分かれば、ディスク上のどこにアクセスすれば読み出せるか分かるということだ。(ディスク上のどのブロックからどのサイズ分読み出せばよいか分かる)

参照:

はじめてのOSコードリーディング ~UNIX V6で学ぶカーネルのしくみ (Software Design plus)

はじめてのOSコードリーディング ~UNIX V6で学ぶカーネルのしくみ (Software Design plus)

以上。