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 とかって何?