この質問は、割り込み処理のトピックからのものです。
割り込みが処理されているとします。最初の割り込みアクションが完了する前に別の割り込みが発生した場合はどうなりますか?
この質問は、割り込み処理のトピックからのものです。
割り込みが処理されているとします。最初の割り込みアクションが完了する前に別の割り込みが発生した場合はどうなりますか?
以下は x86 アーキテクチャにのみ適用されますが、他のアーキテクチャも同じパターンに従う可能性があります。
IF
ハードウェア割り込みを処理できるかどうか、または保留にする必要があるかどうかを制御する (割り込みフラグ)と呼ばれるプロセッサ フラグがあります。IF = 0 の場合、割り込みは、フラグが再度有効になるまで延期されます (ブロックできない「緊急時のみ」の割り込みとして意図されている NMI、マスク不可割り込みを除く)。
これIF
は、割り込み処理ルーチンが呼び出される前に、プロセッサによって自動的にクリアされます。これは、割り込み呼び出しが制御不能になるのを防ぐために必要です。IF
ルーチンに入る前に割り込みを無効にしないと、サービス コードが 1 つの命令を実行する前に、さらに多くの割り込みが発生する可能性があるため、割り込みサービス コード自体は単独でこれを行うことができないことに注意してください。次に、割り込みの「ファイアホース」により、(すべてのことの) スタック オーバーフローが即座に発生します。
したがって、あなたの直接の質問への答えとして、通常、最初のハードウェア割り込みが処理されている間に 2 番目のハードウェア割り込みが発生すると、その割り込みは最初の割り込みが完了するまで保留されます。
いつものように、ストーリー全体はもう少し複雑です。IntelのWeb サイトにあるIntel Architecture Software Developer's Manualには、10-4 ページから始まるより完全な説明が記載されています。
システムによって異なります。通常、新しい割り込みが最初の割り込みより優先度が高い場合は、最初の割り込みのハンドラーを一時停止して応答します。そのハンドラが終了すると、元の割り込みハンドラが再開します。最後に、これ以上割り込みがないと仮定すると、元のハンドラーが終了し、通常のサービスが再開されます。再開されたプロセスが、中断されたプロセスである場合があります。場合によっては、それが最も適切なプロセスではなくなり、別のプロセスが再開されることがあります。
同様に、最初のハンドラが完了する前に元の割り込みの 2 番目以降のインスタンスが発生した場合、または優先度が低いか同等の割り込みが発生した場合、最初のハンドラが完了するまで保留されます。通常の処理が再開される前に、カーネルは、処理されるはずだったがブロックされた未処理の割り込みをチェックします。
割り込みハンドラは、他の割り込みをブロックする場合があります。
最初の割り込みの後に割り込みが無効にされなかった場合、2 番目の割り込みにより、割り込みサービス ルーチンが再度呼び出されます。この明らかに望ましくない動作を回避するには、割り込みが無効になっていることを確認する必要があります。
そのため、割り込みサービス ルーチンが処理を行っているときに別の割り込みが発生した場合、他の処理を行っているかのように、対応する割り込みルーチンが呼び出されます。
Intel アーキテクチャでは、"cli" 命令は割り込みを無効にし、"sti" 命令は再び割り込みを有効にします。