2009-05-31 12 views

答えて

0

最初の割り込み後に割り込みが無効にならなかった場合、2番目の割り込みは割り込みサービスルーチンを再度呼び出します。この明らかに望ましくない動作を避けるために、割り込みが無効になるようにする必要があります。

したがって、割り込みサービスルーチンがその処理を行い、別の割り込みが発生した場合、それはまるでほかのことをしているかのようになります:対応する割り込みルーチンが呼び出されます。

Intelアーキテクチャでは、 "cli"命令は割り込みを無効にし、 "sti"は再び有効にします。

2

システムによって異なります。通常、新しい割込みが最初の割込みより高い優先順位の場合、それは最初の割込みのハンドラを中断して応答されます。ハンドラが終了すると、元の割り込みハンドラが再開します。最後に、割り込みがなくなれば元のハンドラは終了し、通常のサービスが再開されます。場合によっては、再開されたプロセスは中断されたプロセスになります。時には、それはもはや最も適格なプロセスとなり、他のプロセスは再開されます。

同様に、最初のハンドラが完了する前に元の割り込みの2番目以降のインスタンスが発生した場合、またはより低いか等しい優先割り込みが発生した場合は、最初のハンドラが完了するまで保持されます。通常の処理が再開される前に、カーネルは処理されたがブロックされていた未処理の割り込みをチェックします。

割り込みハンドラは、他の割り込みをブロックすることがあります。

4

以下のみx86アーキテクチャに適用されるが、他のアーキテクチャはよく同じパターンに従うことがあります

ハードウェア割り込みを処理し、またはそれに有することができるかどうかを制御 IF(割り込みフラグ)と呼ばれるプロセッサフ​​ラグがあり

保留にする。 IF = 0のときは、フラグが有効になるまで割り込みが延期されます(NMI以外はブロックできない「緊急時のみ」割り込みを意図したマスク不可割り込み)。

割り込み処理ルーチンが呼び出される前に、IFは自動的にプロセッサによってクリアされます。これは、割り込み呼び出しが制御不能になるのを防ぐために必要です。 IFがルーチンに入る前にディスエーブルされていなければ、サービスコードが単一の命令でも実行する時間がある前に、より多くの割り込みが発生する可能性があるため、割り込みサービスコード自体はこれを行うことができないことに注意してください。そして、割り込みの「ホーゼット」はすぐに(すべてのものの)スタックオーバーフローを引き起こします。

あなたの直接の質問に答えて:通常、最初のものが処理されている間に2番目のハードウェア割り込みが発生すると、その割り込みは最初の割り込みが終了するまで保留になります。

いつものように、完全なストーリーは少し複雑です。 IntelのWebサイトのIntel Architecture Software Developer’s Manualには、10-4ページから始まるより完全な説明があります。

関連する問題