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()

な手続きが終わったら、この手続きを実行。

    /*
     * 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カーネル解析入門によると全然そんな訳ゃなくって、まだまだ先は長いそうな。

今後はとりあえず上記処理を順番に見ていく事にします。

追記

あら?? init_bsp_APIC() で virtual wired mode に設定したら init_8259A() での I/O ポートへの出力はとりあえずは bsp な local APIC に対してキイてる、と見て良いのかな??
これについても別途調べてみます。あと、ペンディング事項も整理した方が良いな。