UNIX 6th code reading - ファイルシステム概要その2

はじめに

前回のエントリの続きで、今回もUNIX v6のファイルシステムを見ていきます。

前回はブロックデバイスを中心に見ていきました。今回はコアメモリを中心に見ていきます。

コアメモリ中のファイル関係のデータ構造

inode構造体

アクティブなファイルのinodeなどはコアメモリ中のinode[]構造体の配列(5659行目で定義)に格納されます。ブロックディスク上で扱われるinode構造体の定義(5605行目で定義)と中身が少し異なりますので注意してください。

inode構造体はi_countという参照カウントをもっており、このカウントが0だった場合、そのinodeエントリは割りあてられていない空きエントリとみなされます。

file構造体

ファイルをオープンすると、5507行目で宣言されているfile構造体の配列にエントリが追加されます。

file構造体はREAD, WRITE, PIPEを示すフラグを持ち、また、READ, WRITEにそれぞれ対応したオフセット(読み書き中のバイト)を持ちます。

file構造体は対応したinodeへのポインタを持ちます。

u.u_ofile

u.u_ofile配列は、そのプロセスが開いているファイル(fileのエントリ)へのポインタを格納します。

newproc( )を見るとわかりますが、子プロセスにはu.u_ofile[]の情報は引き継がれます(1876-1878行目)。つまり、親が開いているファイル情報は、子にそのまま引き継がれます。

上記を絵でまとめるとこんな感じです。

fileとinodeを分けているので、複数のプロセスがある一つのファイルに対し、独立した読み書きオフセットと読み書きモードを持つことができます。これにより、複数ファイル独立にファイルの読み書きを行いやすくなります。

ファイルの読み込み、ファイルへの書き込み

ユーザプロセスはシステムコールを使ってファイルからユーザ空間にデータを読み込み、ユーザ空間からファイルへデータを書き込みます。

ファイル関係のシステムコールについては、後のエントリで詳細をまとめる予定です。

終わりに

今回はコアメモリ中でのファイル周りのデータ構造を解説しました。

次回はブロックデバイスからコアメモリへのinode割り当てを解説する予定です。

当初はLions本に従って解説をする予定でしたが、Lions本のファイルシステム周りの解説がわかりづらく感じたので、自分なりにまとめていくことにしました。