10

よく書かれたカーネルの本でも、次の質問に対する適切な答えを見つけることができませんでした。

  1. 彼らは、ISR はどのプロセスにも接続されていないため、ISR を再スケジュールできないため、スリープできないと言っています。中断された ISR は再スケジュール (実行) されませんか? はいの場合、どのように、誰がその作業を行いますか?

  2. 多くの場合、割り込みを無効にします (例: 1.クリティカル領域で 2. 高速割り込みが実行されている場合、現在のプロセッサのすべての割り込みが無効になります)。それらは単に破棄されますか?または後で実行するためにどこかに保存されますか?はいの場合、どこでどのように?

  3. ISR が実行されている場合、現在の IRQ ラインの割り込みを無効にして、再入を回避します (同じラインで別の ISR が実行されるのを防ぎます)。ISR が再入可能である場合、何が問題になりますか?

*ISR=割り込みサービスルーチン

*彼ら=本の著者

4

4 に答える 4

2

割り込みは、最初に現在のCPU状態を保存し、プログラムカウンター(PC)に割り込みベクトルテーブルの場所にジャンプさせることにより、ユーザースペースからカーネルへの実行をトラップします。次に、このテーブルは、現在のプロセス状態を保存し、割り込みIDをISRの開始にマップするカーネル関数(のシーケンス)へのポインターを提供します。ISR中に優先度の高い割り込みが発生すると、実行中のISRと着信割り込みの両方が同じ(カーネル)プロセスによって処理されることを除いて、同じ一連のイベントが発生します。したがって、プロセスはスリープ状態になりません。

もちろん、新しい割り込みが無効になっている場合は無視されます。ただし、プロセッサがより優先度の高い割り込みを処理しているときに割り込みを有効にすると、割り込みが保留になる可能性があります。

ISRはカーネル空間内の関数呼び出しであり、独自のスタックを割り当てる必要があります。プリエンプションが多すぎると、リエントラント割り込みによってスタックオーバーフローが発生する可能性があります。ほとんどのカーネル(LinuxおよびWindowsを含む)のスタックサイズは固定されています。

于 2013-02-12T22:13:09.900 に答える
1

私の知る限り、ISR は別の割り込みによってプリエンプトされ、その後も実行を続けることができます。プロセスがスタックに置かれ、ISR が置かれない理由がわかりません。

プロセスはオペレーティング システム レベルのものであり、ISR は CPU レベルのものです。プロセス内で sleep() を呼び出すと、オペレーティング システムに、適切な作業がなく、別のプロセスを実行する可能性があることがわかります。これは ISR には適用されません。

また、割り込みを禁止するとはどういう意味ですか?

于 2012-08-02T14:39:08.927 に答える
0

私はあなたの質問の1つに答えようとします。1)ISRは、現在実行中のプロセスのコンテキストで実行されるため、スリープできません。それらがスリープすると、現在実行中のプロセスがスリープ状態に移行します。それは望ましくありません。

于 2012-08-06T20:52:35.760 に答える