Lions' 本読み (127)
バッファ操作のあたり、土曜日のファイルシステム編のおかげでイメージが前よりも容易になりました。
現時点で read/write なナニを完全にスルーしていますが、確認できている分をもとにもう少しデータ構造な切り口で見てみます。
binit 手続きに関する記述訂正
av_ なリストの初期設定スルー? って書いてますが嘘ですね。昨晩のエントリを見てみたらその部分が飛ばされてます。
struct buf な配列 buf の属性の初期設定な部分。ここでポインタで属性を参照できるようにしておいて、
5064 for (i=0; i<NBUF; i++) { 5065 bp = &buf[i];
b_dev 属性は NODEV を設定。
5066 bp->b_dev = -1;
b_addr 属性は実際のバッファの先頭アドレスを設定。
5067 bp->b_addr = buffers[i];
ここは bfreelist の末端に追加の処理。これでリストを順に手繰ると buf な配列の先頭から云々、という操作が可能になるはず。
5068 bp->b_back = &bfreelist; 5069 bp->b_forw = bfreelist.b_forw; 5070 bfreelist.b_forw->b_back = bp; 5071 bfreelist.b_forw = bp;
で、b_flags 属性を B_BUSY で初期化して (テキストによればあまり意味はないらしい)
5072 bp->b_flags = B_BUSY;
brelse 手続きに bp を渡して bfreelist の av_ なソレにこちらも末端から追加していきます。
5073 brelse(bp);
ここが漏れてました。この brelse 手続きのおかげで av_ なリストの初期化ができる模様。ということなので binit 手続きを呼び出して戻った時には
- bfreelist の b_ リストおよび av_ リストは buf 配列の各要素を順に指す形になっている
- rktab の b_ なリストは空
という形になっているはず。なので bfreelist については
- av_ なリストはその所属要素を brelse および notavail で入れたり出したり
- b_ なリストは binit で設定されてそのまんま
- av_ なリストも binit で初期設定されます
rktab については現時点で朝の理解で問題ないはず。
そういえば
binit 手続きで以下な記述があってびっくりしました。
5076 for (bdp = bdevsw; bdp->d_open; bdp++) {
bdp の定義は以下。
5060 struct bdevsw *bdp;
struct bdevsw なポインタを ++ したら次の要素にポイントできるのか、とある意味当り前な挙動な記述を見てびっくりするあたり、病んでいる気がしています。
とりあえず
熱が覚めない、というか忘却の彼方に去ってしまわないうちに Section 3 のあたりをがっつり読んでログを残す方向で考えてます。