web-dev-qa-db-ja.com

割り込みマスキング:なぜですか?

私は割り込みについて読んでいました。特別な割り込みマスクを介して、重要ではない割り込みを一時停止することができます。これは、割り込みマスキングと呼ばれます。私が知らないのは、割り込みを一時的に中断したい、または一時停止する必要があるのはいつ/なぜですか?おそらくセマフォ、またはマルチプロセッサ環境でのプログラミング?

21
user249375

OSは、独自の「世界をオーケストレーションしよう」コードを実行する準備をするときにそれを行います。

たとえば、ある時点でOSスレッドスケジューラが制御します。プロセッサレジスタと、スレッドを実行する前に実行する必要のあるその他すべてを準備して、そのプロセスとスレッドの環境を設定します。次に、そのスレッドを実行させる前に、スレッドがCPUに保持する予定の時間が経過した後に発生するタイマー割り込みを設定します。

その期間(クォンタム)が経過すると、割り込みが発生し、OSスケジューラが再び制御を取ります。次に何をする必要があるかを理解する必要があります。そのためには、CPUレジスタの状態を保存して、実行するコードの副作用を元に戻す方法を知る必要があります。状態の保存中に何らかの理由で別の割り込みが発生した場合(たとえば、一部の非同期I/Oが完了した場合)、OSは、そのワールドがnotで有効な状態(事実上)になります。 、状態の保存はアトミック操作である必要があります)。

したがって、そのような状況に巻き込まれるのを避けるために、OSカーネルは、アトミックである必要があるそのような操作が実行されている間、割り込みを無効にします。必要な処理をすべて実行し、システムが再び既知の状態になった後、割り込みを再度有効にします。

36
Jon

以前は、発生する可能性のある割り込みが約10個あるARMボードでプログラムしていました。私が作成した特定の各プログラムは、4つ以上に関心がありませんでした。たとえば、2つのタイマーがありました。ボード、しかし私のプログラムは1しか使用しませんでした。2番目のタイマーの割り込みをマスクしませんでした。そのタイマーをマスクしなかった場合、タイマーが有効になり、割り込みを続けてコードの速度が低下した可能性があります。

もう1つの例は、UART受信REGISTERフル割り込みを使用するため、UART受信BUFFERフル割り込みを発生させる必要がないことです。

これにより、割り込みを無効にする理由についての洞察が得られることを願っています。

16
WuHoUnited

すでに与えられた答えに加えて、それに優先する要素があります。必要な、またはできるだけ早く応答できるようにしたい割り込みと、あまり忙しくない場合にのみ知りたい割り込みがあります。最も明白な例は、ネットワークからの新しいパケットを処理するのではなく、DVDライターの書き込みバッファーを補充することです(時間内にそうしないと、一部のハードウェアがDVDを誤って書き込むだけです)。前者の割り込みを受信したら後者の割り込みを無効にし、バッファがいっぱいになるまで無効のままにします。

実際には、かなりの数のCPUがハードウェアに直接組み込まれた割り込み優先度を持っています。割り込みが発生すると、無効化されたフラグがより少ない割り込みに設定され、多くの場合、その割り込みは、割り込みベクトルの読み取りと関連するアドレスへのジャンプと同時に行われます。割り込みの受信を指示すると、割り込みハンドラーが終了するまでその割り込みが暗黙的にマスクされ、ハードウェアの割り込みに対する制限が緩和されるという素晴らしい副作用があります。例えば。シグナルハイが割り込みをトリガーし、外部ハードウェアを離れて、誤って複数の割り込みをトリガーすることを心配せずに、ラインをハイに保持する期間を決定すると簡単に言うことができます。

多くの時代遅れのシステム(z80と6502を含む)では、割り込みのレベルはマスク可能とマスク不可の2つしかない傾向があります。これは、割り込みを有効または無効にする言語の由来だと思います。ただし、元の68000までさかのぼると、8つのレベルの割り込みと、CPUに現在の優先度レベルがあり、実際に有効にすることができる着信割り込みのレベルを決定します。

16
Tommy

CPUが「int3」ハンドラーにあり、そのときに「int2」が発生し、新しく発生した「int2」の優先度が「int3」よりも低いとします。この状況にどのように対処しますか?

方法は、「int3」を処理するときに、他の優先度の低いインタラプタをマスクすることです。つまり、「int2」はCPUに信号を送っていますが、CPUはそれによって中断されません。 「int3」の処理が終了したら、「int3」から戻り、優先度の低いインタラプタのマスクを解除します。

私たちが戻った場所は次のとおりです。

  1. 別のプロセス(プリエンプティブシステム)
  2. 「int3」によって中断されたプロセス(非プリエンプティブシステムまたはプリエンプティブシステムの場合)
  3. 「int3」によって中断されるintハンドラー、たとえばint1のハンドラー。

ケース1と2の場合、優先度の低いインタラプタのマスクを解除し、「int2」がまだCPUに信号を送っているため、「こんにちは、すぐに処理できるものがあります」と、CPUが命令を実行しているときに再び割り込みが発生します。プロセスから、「int2」を処理する

ケース3の場合、「int2」の優先度が「int1」よりも高いと、CPUは「int1」のハンドラーからの命令を実行しているときに「int2」を処理するために再び中断されます。

それ以外の場合、「int1」のハンドラーは割り込みなしで実行され(「int1」よりも低い優先度で割り込みをマスクしているため)、CPUは「int1」を処理してマスクを解除した後にプロセスに戻ります。その時は「int2」が扱われていました。

1
user4378998