Lions' 本読み (142)

宿題になっていた

  • rkintr な割り込みハンドラの優先度確認
    • 割り込みハンドラ自体の優先度も確認
  • d_actl の使途

あたりを確認してみます。

優先度云々

以下なあたりがディスク割り込みの入口か。

0543 . = 220^.
0544    rkio; br5

優先度は 5 ということでこれより優先度が高い割り込みはクロック割り込みとトラップのみ、ということで良いのかどうか。テキスト的にはプログラマブルクロック、というものがあるようですがスルー。
そして割り込みハンドラの優先度ですがテキスト 337p に以下な記述がありますね。

UNIX では、割り込み処理ルーチンは割り込み優先度と同じ優先度で開始される。

Lions' Commentary on UNIX より引用
あ、rkstrategy 手続きとかでクリティカルセクションで spl5 とかしてるのはディスク割り込みを止める効果があるのか成程。

d_actl の使途

xref を手繰ってみます。定義が以下。

4558    struct buf *d_actl; /* I/O キューの末尾 */

で、使われているのは rkstrategy 手続きの以下の部分のみですね。

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;

rkstrategy 手続きでは I/O キューの末端に追加してますが、先頭が空の場合は先頭に、そして先頭が空でない場合にはその時点の末端要素なオブジェクトの av_forw 属性にこれから末端に追加されるオブジェクトを設定してます。
取り出されるのはキューなので前から順に (actf から) になるんですが、取り出される属性の av_forw 属性には次要素のポインタが格納される、という事になるのか。
で、キューを再設定するのはキューの先頭のバッファの処理が終わった時点で呼び出される割り込みハンドラの rkintr になっているはず。

5470    rktab.d_actf = bp->av_forw;

ちなみに bp には I/O キューの先頭 (d_actf 属性) から取り出したバッファのポインタになります。上に書いた通り、_先頭の次_が設定される訳ですね。
何故に末端要素が必要か、と言えば rkstrategy で設定している「末端要素の次に追加」という処理のためなのか。