interrupt シンボルの解決
void __init init_IRQ(void) { int i; /* all the set up before the call gates are initialised */ pre_intr_init_hook(); /* * Cover the whole vector space, no vector can escape * us. (some of these will be overridden and become * 'special' SMP interrupts) */ for (i = 0; i < (NR_VECTORS - FIRST_EXTERNAL_VECTOR); i++) { int vector = FIRST_EXTERNAL_VECTOR + i; if (i >= NR_IRQS) break; if (vector != SYSCALL_VECTOR) set_intr_gate(vector, interrupt[i]); }
arch/i386/kernel/i8259.c
init_IRQ() にて割り込みディスクリプタテーブル (interrupt descriptor table) の初期化が行われている箇所。上記繰り返しにおける vector の値が_割り込みベクタ番号_ (32 〜 255) で、i が IRQ になっているハズ。
んで、amazon:Linux カーネル解析入門によると
「Linuxカーネル」自身は割り込み処理を行なう際、「割り込みベクタ番号」ではなく、「IRQ」で割り込みハンドラを管理します。
amazon:Linux カーネル解析入門より引用
とか
「IRQ」と「割り込みベクタ」は別物です。「Linuxカーネル」が直接意識するのは、「IRQ」のほうです。
amazon:Linux カーネル解析入門より引用
などと繰り返し記述されているが、割り込みゲートに登録する時の添字がスデに違うし確かにその通りっちゃその通りだな。
とりあえず、割り込み発生→プロセッサが割り込み受信→interrupt[IRQ番号] の起動、という一連の手続きは CPU の範疇として、interrupt のシンボル解決についてもやってみたら結構簡単に分かった。
- arch/i386/kernel/i8259.c において
#include <linux/irq.h>
している。
#include <asm/hw_irq.h>
している。
- /usr/include/asm/hw_irq.h において
extern void (*interrupt[NR_IRQS])(void);
が宣言されておりました。めでたしめでたし。(探した順番は逆ッス)
次はデータ構造ですな。