カーネルは、その特定の共有回線のすべてのハンドラーを順番に呼び出します。
その通り。Dev1とDev2がIRQ10を共有するとします。IRQ10の割り込みが発生すると、この回線に登録されているすべてのISRが1つずつ呼び出されます。
このシナリオでは、Dev2が割り込みを生成したとしましょう。Dev1のISRが最初に登録された場合、そのISR(つまり、Dev1のISR)が最初に呼び出されるだけです。そのISRでは、割り込みステータスレジスタの割り込みが検証されます。割り込みビットが設定されていない場合(この場合、Dev2が割り込みを発生させたため)、割り込みがDev1によって生成されなかったことを確認できます。したがって、Dev1のISRはカーネルに戻る必要がありますIRQ_NONE
。つまり、「その割り込みを処理しませんでした」 、したがって、カーネルは次のISR(つまり、Dev2のISR)に進みます。これにより、対応するデバイスが割り込みを生成したことを実際に確認します。したがって、このハンドラーはそれを処理し、最終的には戻りIRQ_HANDLED
ます。つまり、「これを処理しました。 "。
詳細については、戻り値IRQ_NONE/IRQ_HANDLEDを参照してください。
対応するデバイスが割り込みを発行したかどうかをハンドラーはどのようにして知るのですか?
割り込みステータスレジスタのみを読み取る。
この情報は、デバイスとプロセッサの割り込みラインの間にある割り込みコントローラを介して中継されますか?
これについてはよくわかりません。ただし、OSは、ISRからの戻り値に基づいてISRの呼び出しを処理します。