Lions' 本読み (133)

朝練メモ。 v6 unix vol.2 in okinawa なスライドの 57 枚目の_ファイルシステムの構造 fd 視点_のあたりを切り口で中身掘削。
始点としては user 構造体の

0438  int u_ofile[NOFILE]; /* オープン中ファイルの file 構造体へのポインタ */

というあたり。ちなみに NOFILE の定義は以下。

0139 #define NOFILE 15 /* プロセスごとの最大オープンファイル数 */

ありゃ、user 構造体て新しいプロセスが kick される時にどんなしてコピィされるんだったかなぁ。て、脱線してまわない内に確認すすめないと。
とりあえず、user 構造体から file 構造体は以下なカンジで参照してるようです。

1876    for(rip = &u.u_ofile[0]; rip < &u.u_ofile[NOFILE];)
1877            if((rpp = *rip++) != NULL)
1878                    rpp->f_count++;

で、その file 構造体の定義と静的に確保される file という配列の定義が以下。

5507 struct file
5508 {
5509    char f_flag;
5510    char f_count;      /* 参照カウント */
5511    int f_inode;       /* inode 構造体へのポインタ */
5512    char *f_offset[2]; /* read/write キャラクタポインタ */
5513 } file[NFILE];

NFILE の定義が以下。

0132 #define NFILE 100 /* インコア file 構造体の数 */

詳細は略して inode 構造体というヤツを確認してみます。構造体の定義はとりあえずスルーで、コメントによれば以下とのこと。

5655 * i ノードは dev/i 番号の組によって ' 名付けられる ' (iget/iget.c)。

ええと、iget ではコアにいる inode な配列を探索してそこに無ければ

7319    ip = bread(dev, ldiv(ino+31, 16));

でバッファキャッシュ {に,から} 取得した後に

7332    brelse(ip);

で av_ なリストに戻しています。このあたりのバッファな処理のあたりはイメージしやすい状態になってたりするんですが上の読み込んで解放までの間の処理が色々と微妙。

7328    ip1 = ip->b_addr + 32*lrem(ino+31, 16);
7329    ip2 = &p->i_mode;
7330    while(ip2 < &p->i_addr[8])
7331            *ip2++ = *ip1++;

これ、Sheet 56 の struct i_node が使われているらしいんですが、以下なコメントも含め、根拠が色々とアレです。

7267  * どんな場合でも、ロックされた inode 構造体への
7268  * ポインタが返される。

ちょっと時間切れ。ここ宿題にって思ってるんですが色々な意味でハードル高すぎる。