ISRハンドラーの上半分で実行できることまたは実行する必要があることは何ですか。割り込みが最初に無効になっていることがわかります。これが行われると、現在の割り込みの処理中に到着する可能性のある他の割り込み(同じIRQライン上)を見逃しませんか?
または、現在実行中のISRの最後にその回線で割り込みが再度有効にされた後に処理できるように、欠落している割り込みを追跡する「エンティティ」はありますか?
ISRハンドラーの上半分で実行できることまたは実行する必要があることは何ですか。割り込みが最初に無効になっていることがわかります。これが行われると、現在の割り込みの処理中に到着する可能性のある他の割り込み(同じIRQライン上)を見逃しませんか?
または、現在実行中のISRの最後にその回線で割り込みが再度有効にされた後に処理できるように、欠落している割り込みを追跡する「エンティティ」はありますか?
共有割り込みについて簡単に説明します。共有割り込みラインは常にレベルセンシティブなデバイスを使用する必要があります。これらのデバイスもすべて同じレベル(高対低)である必要があります。エッジトリガー割り込みでは、一方のデバイスがトリガーされた後、定常状態に戻る前に、もう一方のデバイスがトリガーされないことを保証する方法はありません。避けられない競合状態になります。
一方、レベルトリガー割り込みは、それをトリガーしたデバイスのフラグがクリアされるまでアクティブのままです。最初のデバイスを処理しているときに、2番目のデバイスがトリガーされると、ハンドラーがIRQラインを再び有効にするまで、IRQラインがアクティブのまま待機します。
割り込みハンドラは可能な限り最小限にする必要があります。
割り込みを無効にする必要は必ずしもありません。一部のアーキテクチャは、ネストされた割り込みで動作します。とにかく、割り込みを無効にする場合は、それ以上ではなく、1つまたは2つのコマンドに対して行う必要があります。これにより、遅延が発生し、割り込みを見逃す可能性があります。
割り込みを処理するとき、私は通常2つのことをします。1つは、割り込みの原因となったフラグをクリアすることです。2つ目は、後でいくつかの機能(タスクレット、ワークキューなど)をトリガーすることです。
printfやミューテックスの取得など、スリープする可能性のある割り込みハンドラーでメソッドを使用しないように注意してください。
IRQストームを回避するには、割り込みを適切に確認する必要があります。割り込み自体を処理します-実行する大きな仕事がある場合は、下半分にオフロードします。
割り込みが無効になっている場合の動作:x86では、cli
命令はISRが実行されている現在のCPUで割り込みを無効にします。1つのIRQがバッファリングされるため、割り込みがで復元されるとsti
、それが配信されます。
APIC割り込みを使用する場合、バッファリングはカーネル自体で行われます。カーネルはAPIC割り込みを確認し、enable_irq
が呼び出されたときに再度トリガーします。