init_IRQ() を追いかける
まず、init_IRQ() → pre_intr_init_hook() → init_ISA_irqs() のあたりを調べてみる。
PIC を初期化している init_8259A() は別途。又、APIC 関連も別途。
具体的には以下のあたり。
for (i = 0; i < NR_IRQS; i++) { irq_desc[i].status = IRQ_DISABLED; irq_desc[i].action = NULL; irq_desc[i].depth = 1; if (i < 16) { /* * 16 old-style INTA-cycle interrupts: */ irq_desc[i].handler = &i8259A_irq_type; } else { /* * 'high' PCI IRQs filled in on demand */ irq_desc[i].handler = &no_irq_type; } }
で、irq_desc_t 型の配列 irq_desc の定義はドコ??と思い、M-. してみたら include/linux/irq.h に行きついた。
typedef struct irq_desc { hw_irq_controller *handler; void *handler_data; struct irqaction *action; /* IRQ action list */ unsigned int status; /* IRQ status */ unsigned int depth; /* nested irq disables */ unsigned int irq_count; /* For detecting broken interrupts */ unsigned int irqs_unhandled; spinlock_t lock; } ____cacheline_aligned irq_desc_t; extern irq_desc_t irq_desc [NR_IRQS];
む。外部参照でねーか。構造体メンバの役割は別途にして実体はドコだよ。たしか do_IRQ() の先でも使っているはずなんで、と思い arch/i386/kernel/entry.S から M-. で手繰ってみる。
__do_IRQ() が書いてあるのは kernel/irq/handle.c で、ここに実体が定義されてた。
irq_desc_t irq_desc[NR_IRQS] __cacheline_aligned = { [0 ... NR_IRQS-1] = { .status = IRQ_DISABLED, .handler = &no_irq_type, .lock = SPIN_LOCK_UNLOCKED } };
この書き方 ([0 ... NR_IRQS-1]) も gcc 拡張なんだろうか。根拠を探さねば。静的変数なんでプログラム開始と同時に上記のメンバが初期化されてあとは 0 と。
とりあえずここまでにしといて別エントリにて、irq_desc_t 構造体のメンバと初期化された状態について調べたモノを投入します。コメントも読みたい。