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 になるんだけどこれは一体何でしょ。

とりあえず

出かける支度をしよう。