コアメモリ中のファイル関係のデータ構造
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本のファイルシステム周りの解説がわかりづらく感じたので、自分なりにまとめていくことにしました。