Lions' 本読み (93)
ええと、swap 手続きで云々している bdevsw は strct bdevsw な配列になっており、その d_strategy という属性が手続きとして呼び出される形になってます。
5212 (*bdevsw[swapdev>>8].d_strategy)(&swbuf);
それにしても定義のあたりがなかなかに微妙。以下が構造体宣言とポインタの定義 (?)
4617 struct bdevsw { 4618 int (*d_open)(); 4619 int (*d_close)(); 4620 int (*d_strategy)(); 4621 int *d_tab; 4622 } bdevsw[];
で、次のページに手続きポインタな配列という形で初期化な記述があります。
4656 int (*bdevsw[])() 4657 { 4658 &nulldev, &nulldev, &rkstrategy, &rktab, /* rk */ 4659 &nodev, &nodev, &nodev, 0, /* rp */
一次元配列の初期化な形になってるのかなんともアレゲ。
このあたりの微妙な部分にツッコミを入れているのは止めて中身を確認。rdstrategy 手続きですが以下な部分が核心らしい。
5407 bp->av_forw = 0; 5408 spl5(); 5409 if (rdtab.d_actf==0) 5410 rktab.d_actf = bp; 5411 else 5412 rktab.d_actl->av_forw = bp; 5413 rktab.d_actl = bp;
rktab は struct devtab 型ですね。ええと、d_actf 属性が NULL でなければ d_actl 属性にも何らかのオブジェクトがセットされてるのか。双方向リストってことなので一件のみだと同じソレを d_actf も d_actl も指してる形になるのか。
つうか、struct devtab と struct buf のカラミがイメージできてない。あ、ラストの前、なのか。や、次か。そうか、登録されてるオブジェクト自体は同じモノなので
先頭 - その次 - その次 - その次 - ラスト
みたいな表現ができるのか。
つうか、操作完了時に発生する割り込み処理な rdintr 手続きでリストの後始末してますね。まず先頭要素を確保しておいて
5457 bp = rktab.d_actf;
もごもごした後で次の要素を先頭にセット。
5470 rktab.d_actf = bp->av_forw;
で、iodone 手続き呼び出してます。
しかし何となくいっちゃん肝心な部分がマスクされたまま話が進んでるような気がしてなりません。別途諸々きちんと確認な方向にて。