1

上半身と下半身の概念を理解しているうちに、ある疑問に出会いました。

これが私の理解です:上半分と下半分は割り込みコンテキストで実行されます。唯一の違いは、下半分は割り込みを有効にして実行し、上半分は対応する irq を無効にして実行することです (これは、SA_INTERRUPTフラグを使用して克服できます)。

質問: 上半分のハンドラーから戻る直前にreturn_from_intr呼び出されます。現在、スケジューラが呼び出され、保留中のものがある場合は下半分が実行されます。が呼び出されたのでreturn_from_intr、どのように下半分を割り込みコンテキストで実行できますか? 割り込みモードではなく、カーネル モードになりますか?

間違っている場合は修正してください。

4

4 に答える 4

2

下半分は割り込みコンテキストでは実行されません。これは、割り込み処理を 2 つに分割し、低速のコードを ISR の外に移動するという全体的なポイントです。ただし、それらはまだカーネル コンテキストにあります。たとえば、この記事を参照してください。

于 2012-09-04T09:38:44.353 に答える
0

あなたの質問にあるいくつかの仮定は間違っています:

  • 上半分のハンドラーは割り込みコンテキストで実行されます
  • 3 つの異なる下半分のメカニズムが存在します。
    • 割り込みコンテキストで実行されるSoftirqs
    • taskletは、softirq の上に構築されているため、割り込みコンテキストで実行されます。
    • プロセス コンテキストで実行される唯一の下半分のメカニズムであるワーク キュー

これらすべてのメカニズムを説明しているRobert Loveの優れた本を参照することをお勧めします。

于 2016-02-12T11:56:35.650 に答える
0

割り込み処理の異なる部分であるタスクレットとソフトIRQは、ソフトウェア割り込みの上で実行されます。したがって、それらは、すべての CPU ですべての hardirq が有効になっている割り込みコンテキスト (紛らわしいので、これを下半分のコンテキストと呼びます) で実行されていると言われています (まだ制御は手元にあります)。ソフトウェア割り込みは、spin_lock_bh() を使用して処理中に必要に応じて無効にすることもできます。
ワーク キューは、割り込み処理の別の方法であり、カーネル プロセス コンテキストで実行されます。したがって、ブロックしたり、スリープしたり、スケジュールを呼び出したりできます。

于 2014-03-17T15:29:14.670 に答える
0

ここでの「割り込みコンテキスト」は、in_interrupt() が true を返しますが、in_irq() が false を返すソフトウェア割り込み/softirq コンテキストを指します。つまり、このコアの他のソフト IRQ は無効になっていますが、ハードウェア IRQ は有効になっています。

于 2020-04-26T21:54:05.670 に答える