Lions' 本読み (136)
fd 視点な v6 UNIX Vol.2 in Okinawa の 57 枚目を見つつ実装確認。
備忘
今は確認しないけどいくつか宿題を控え。
- プロセスが生まれる時に ppda がどうやって生成されるのか
- iget 手続きのコメントの根拠 (
確認再開
ええと user 構造体の u_ofile な属性は file 構造体へのポインタとして扱われるということでした。
0438 int u_ofile[NOFILE];
u_ofile 配列の添字がファイルディスクリプタとのこと。で、file 構造体は inode 構造体へのポインタとして f_inode という属性を持っています。
5507 struct file 5508 { 5509 char f_flag; 5510 char f_count; 5511 int f_inode; 5512 char *f_offset[2]; 5512 } file[NFILE];
NFILE は 100 で #define されていて全体で開くことができるのは 100 個、ということになるのかどうか。微妙に f_offset という属性が気になるんですが別途確認。
f_inode 属性は Sheet 56 の unix/inode.h で定義されているインコア inode というオブジェクトを指すポインタになっているはず。
このオブジェクトを取得するためにはデバイス番号と inode 番号を iget という手続きに渡してあげれば良いのですがその中では
- インコア inode なオブジェクトの配列から探索
- 配列に存在してロックされていなければそれを戻す
- 配列に存在してロックされてたら wait
- インコア inode 配列に存在しない場合、bread で読み込み
- バッファキャッシュにあればそれを戻す
- バッファキャッシュになければディスクから読みこんで云々
- 読み込んだバッファの該当領域からインコア inode の必要な部分にコピィ
- デバイス番号と inode 番号もインコア inode の属性に設定
- 読み込んだバッファについては av_ なリストに追加される
そういえばでっかいファイルをどう扱うか、が忘却の彼方に去りつつありますね。テキスト確認しつつこちらも確認しておきたいです。
次は 59 枚目のプロセス視点なソレとして
- proc 構造体の p_textp 属性
- user 構造体の
- u_cdir 属性 (カレントディレクトリの inode ポインタ)
- u_dirp 属性 (ん、何だこれ)
- u_pdir 属性 (dirp の親ディレクトリの inode ポインタ)
あら、u_dirp て何でしょ。とりあえず時間切れ。
いくつか宿題 (というか備忘)
- 参照カウントな i_count 属性で掘削してみたい
- bread/brelse マターで全部を確認してみたい
- サイズが 4096bytes より大きいファイルの取り扱いについて
- user 構造体の u_dirp とか u_pdir とかって何?