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 * ポインタが返される。
ちょっと時間切れ。ここ宿題にって思ってるんですが色々な意味でハードル高すぎる。