8259A 初期化 (2)

初期化手続き init_8259A()#arch/i386/kernel/i8259.c の後処理について。
残りは以下の部分。(コメントは削除)

	if (auto_eoi)
		i8259A_irq_type.ack = disable_8259A_irq;
	else
		i8259A_irq_type.ack = mask_and_ack_8259A;

	udelay(100);

	outb(cached_master_mask, PIC_MASTER_IMR);
	outb(cached_slave_mask, PIC_SLAVE_IMR);

まず、EOI の発行が必要かどうかによって、i8259A_irq_type.ack への関数ポインタの設定を行なっている。Auto EOI なモードであれば disable_8259A_irq を設定 (OS 側からの ACK (EOI の発行) はしない)。そうでない場合は mask_and_ack_8259A を設定している。これらの関数については別途調査。

次は_「割り込みコントローラ」の初期化が完了するのを待つため (amazon:Linux カーネル解析入門より引用)_の udelay() 関数の呼出しとなっている。この関数は引数に指定された数値 * 1 マイクロ秒ほどビジーウエイトを行なうとの記述あり。include/asm-i386/delay.h にマクロの定義があるが、これについても調査は別途。

最後に IMR に対して何かの出力を行なっているんですが、cached_master_mask とか cached_slave_mask ってどこで値が設定されているのか不明。上記三点、今から調べます。