Lions' 本読み (140)
16 のあたりから再読。とりあえず rk.c から。
rkstrategy 手続き
核心は以下なあたりかな。
5407 bp->av_forw = 0; 5408 spl5(); 5409 if (rktab.d_actf == 0) 5410 rktab.d_actf = bp; 5411 else 5412 rktab.d_actl->av_forw = bp; 5413 rktab.d_actl = bp; 5414 if (rktab.d_active==0) 5415 rkstart(); 5416 spl0();
ええと、rktab は
5386 struct devtab rktab;
で、d_act[fl] は I/O キューの先頭、末尾と devtab 構造体の定義なコメントにあります。引用略。なんつーか 5409 から 5413 のあたりとか格好良いですね。
基本的には I/O キューに追加して busy でなければ (d_active 属性が 0 であれば) rkstart 手続きを呼び出して kickoff という事なのかどうか。
テキスト確認
PDP11/70 以外は mapalloc 云々は no-op とのこと。
rkstart 手続き
d_active 属性 ++ して devstart 手続きを呼び出していますね。
5444 if ((bp = rktab.d_actf) == 0) 5445 return; 5446 rktab.d_active++; 5447 devstart(bp, &RKADDR->rkda, rkaddr(bp), 0);
d_active 属性ですが、ぱっと見ではディスク割り込みな手続きで 0 初期化されてますね。あと、devstart 手続きに渡される引数の解説がテキスト 384p にありますね。
RKADDR
定義は以下。
5363 #define RKADDR 0177400
たしかに 0177412 になりますね。直下 (?) に名無しの構造体定義があります。
5376 struct{ 5377 int rkds; 5378 int rker; 5379 int rkcs; 5380 int rkwc; 5381 int rkba; 5382 int rkda; 5383 };
rkda 属性のアドレスは先頭から 8 進で 12 加算したナニ。どうも未だに 8 進に慣れません。
devstart 手続き
ちょっと面白いカンジなんですが、上で引用した名無しの構造体の底から設定してますね。
以下で rkda に値を設定。
5104 dp = devloc; 5105 rbp = bp; 5106 *dp = devblk; /* ブロックアドレス */
devblk は三番目の引数。次が rkba に設定される箇所。
5107 *--dp = rbp->b_addr; /* バッファアドレス */
その次が rkwc に設定される箇所。
5108 *--dp = rbp->b_wcount; /* ワードカウント */
で、最後に com に設定された値を rkcs に設定。
5115 *--dp = com;
テキストの 383p によれば
データ転送を開始する場合、RKDA、RKBA、RKWC を設定し、その後 RKCS を設定する。完了時点でステータス情報が RKCS、RKER、RKDS に設定される。
Lions' Commentary on UNIX より引用
とのことでこの時点でディスクへの要求が完了して、ということになるのか。ここから rkstrategy に戻った時点で割り込み OK になって終了してますね。
とりあえず
これからお出かけらしいので戻って元気なら rkintr あたり以降を云々の方向にて。