local APIC 初期化の続き init_IRQ での処理編
ちょっとリハビリ必要。とりあえず init_bsp_APIC()#arch/i386/kernel/apic.c を順に追いかけてるシリーズの
あたりは一応キリが良い状態になってる、と。
ちなみに amazon:Linuxカーネル解析入門 ではp.149 から p.151 あたりで解説されています。(リハビリしながらざっくり再読)
で、init_bsp_APIC() から戻った後の処理については、amazon:Linuxカーネル解析入門においては p.139 から p.147 くらいまでの部分に詳細な解説あり。
又、このブログのエントリ的には
というあたりでチェキ入れてる通りなんですが、8259A が無い環境で上記の処理 (I/O ポートへの出力等) は基本的にスルーされる、という認識で良いのかな。マニュアル確認する必要はあるな。
で、
- init_IRQ()
- pre_intr_init_hook()
- init_ISA_irqs()
- 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]); }
次にこれ。
/* setup after call gates are initialised (usually add in * the architecture specific gates) */ intr_init_hook();
で、次がこれ。
/* * Set the clock to HZ Hz, we already have a valid * vector now: */ setup_pit_timer();
ラストがこれ。
/* * External FPU? Set up irq13 if so, for * original braindamaged IBM FERR coupling. */ if (boot_cpu_data.hard_math && !cpu_has_fpu) setup_irq(FPU_IRQ, &fpu_irq); irq_ctx_init(smp_processor_id());
んで、これで APIC の初期化が終了するんかと思いきや、amazon:Linuxカーネル解析入門によると全然そんな訳ゃなくって、まだまだ先は長いそうな。
今後はとりあえず上記処理を順番に見ていく事にします。