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 進に慣れません。

rkaddr 手続き

テキストによれば

複数のディスクドライブにまたがるファイルを扱うための特別な機能が組み入れられている。

Lions' Commentary on UNIX より引用
とのこと。あと、フォーマット的に RKDA なレジスタに転送可能な形式に、とのこと。あ、ディスク跨りってそーゆーことなのか。あ、違うかな。

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 あたり以降を云々の方向にて。