割り込みハンドラの起動

割込みハンドラの起動は以下のようにして行われる。

割込みエントリ関数do_IRQ関数(後述)から、割込み制御コントローラに対し、発生した割り込みレベルのマスク(割り込み処理中に同じIRQレベルの割り込みが発生しないようにする)と割り込みに対するACKを返す(割り込みを受け付けたことを通知し、次の割り込みが発生するようにする)。処理方式は、各割込み制御コントローラ(IOAPICや8259など)毎に各々固有の方法で制御しなければならない。

その後、handle_IRQ_event()関数により、発生した割り込みレベルに対応したドライバの割り込みハンドラが実際に起動される。

全てのドライバの割り込みハンドラ実行終了後、割込み制御コントローラに対し、発生した割り込みレベルに対するマスク解除を要求する。

img18.gif
    do_IRQ(割り込み番号IRQ、...)
         同種の割り込みが入らないように、割込みのマスクを行う。
         割込みに対するACKを割り込みコントローラに返す。
         handle_IRQ_event(割り込み番号IRQ、irq_desc[]に登録されているハンドラのリスト)
         割込みマスクの解除

    handle_IRQ_event(割り込み番号IRQ、ハンドラリスト)
         割り込みハンドラ開始宣言(irq_enter関数)
         if(割り込みのネストを許すハンドラなら)
                 CPUの割り込み許可

             登録されている場合は、全てのハンドラを呼ぶ。
         CPUの割り込み禁止
         割り込みハンドラ終了宣言(irq_exit関数)

 

(NIS)HirokazuTakahashi
2000年12月09日 (土) 23時55分06秒 JST
1