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 のあたりをがっつり読んでログを残す方向で考えてます。