linux-0.01 読み (16)
ええと、例えば hd_init 手続きの末端部分で
set_trap_gate(0x2E,&hd_interrupt); outb_p(inb_p(0x21)&0xfb,0x21); outb(inb_p(0xA1)&0xbf,0xA1);
みたいな事してて 0x21 とか 0xA1 って何だよ、とかあるいは hd_interrupt で
movb $0x20,%al outb %al,$0x20 # EOI to interrupt controller #1 jmp 1f # give port chance to breathe 1: jmp 1f 1: outb %al,$0xA0 # same to controller #2
0x20 とか 0xA0 になにかを出力してたりする訳です。で、これは何かあるなって事で grep 先生にお伺いを立てたりしてたら boot/boot.s においてもこのポートに対して云々という処理の記述がある模様。
boot/boot.s
においては何故か初期化なコマンド 0x11 が 0x[2A]0 に対して出力された後は 0x[2A]1 に対してコマンドを出力しているようです。このあたりは intel のマニュアル見たほうが良いのかどうか。
うーむ、割り込みコントローラに対するコマンドなのでそうかな。ちょいマニュアルを見てみましょう。8259 なソレは vol.3 かな。あ、もしかして 8259 な記述とかってマニュアルには出てないのかな。
という事で 8259A のマニュアルも取得。
中身を見てみたらひらのコメントにもきちんと書いてありますが、boot.s でヤッてるのは ICW1 から ICW4 な初期化な模様。
戻って
てー事は hd_init とか hd_interrupts な中のナニは OCW というヤツですな。
しかも hd_interrupts なナニは EOI というコメントがあるんでおそらくは End Of Interrupt 云々な処理なのか。
あ、これって 0x2E なトラップが 8259 に来て起動される処理なの? なので EOI をコントローラ両方に送信してる訳ですな。しかしこのトラップゲート何たらとゆーのが微妙に謎だなぁ。
#define set_trap_gate(n,addr) \ _set_gate(&idt[n],15,0,addr)
もしかすると最初は hd_interrupt 処理するのにトラップを使用していただけかもしれませんが。
あとよく分からんのが hd_init 手続きの中のソレなんですが、これは OCW1 になるのかどうなのか。マニュアル見たら interrupt mask の設定になってます。
0xfb だと 0b11111011 だし 0xbf だと逆に 0b10111111 になるんだけどこれは一体何でしょ。
とりあえず
出かける支度をしよう。