linux-0.01 の hd.c

穴が開くかという勢いでニラんでおります。
hd_init 手続きにて以下な記述あり。

	set_trap_gate(0x2E,&hd_interrupt);
	outb_p(inb_p(0x21)&0xfb,0x21);
	outb(inb_p(0xA1)&0xbf,0xA1);

Interrupt Mask Register に出力する命令な模様。ちなみに PC/AT でのピンアサインは以下のようになっている模様で

Master 8259
IRQ0 - Intel 8253 or Intel 8254 プログラマブルインターバルタイマ、すなわちシステムタイマ
IRQ1 - キーボード
IRQ2 - PC/XTでは割り当てなし。PC/ATではスレーブの8259のINTにカスケード接続されている。
IRQ3 - シリアルポートCOM2及びCOM4
IRQ4 - シリアルポートCOM1及びCOM3
IRQ5 - PC/XTではハードディスクコントローラ。PC/ATではLPT2。
IRQ6 - フロッピーディスクコントローラ
IRQ7 - LPT1
Slave 8259 (PC/AT及びその後継のみ)
IRQ8 - リアルタイムクロック (RTC)
IRQ9 - 割り当てなし
IRQ10 - 割り当てなし
IRQ11 - 割り当てなし
IRQ12 - PS/2 マウス
IRQ13 - 数値演算コプロセッサ
IRQ14 - ハードディスクコントローラ1
IRQ15 - ハードディスクコントローラ2

あとこれらが 0x20 から 0x2F な割り込みに割り当てられるとの事。で、ざっくり確認した所では

  • 0x20 にタイマ割り込みが割り当てられている (sched.c)
  • 0x21 にキーボード割り込みが割り当てられている (console.c)
  • 0x23 および 0x24 にシリアルポートな割り込みが割り当てられている (serial.c)
  • 0x2E にハードディスク割り込みが割り当てられている (hd.c)

というカンジ。

昨晩

unix v7 の解説を聞いたんですが、なんとなくイメージできてるのかどうか。
hd.c の中限定で見てみると

  • add_request は リクエストをキューイングして do_hd が null なら do_request 呼ぶ
  • do_request はキューの先頭を hd_out に渡す
  • hd_out は controller regs. に情報出力して割り込みを発生させて do_hd を呼び出す (?)

という事なのかどうか。