7

割り込みハンドラを呼び出す前に、CPU はローカル CPU のすべての割り込みを無効にしますか? それとも、提供されている特定の割り込みラインのみを無効にしますか?

4

5 に答える 5

4

x86 は、割り込みベクトルにジャンプする前に、すべてのローカル割り込み (もちろん NMI を除く) を無効にします。Linux は通常、特定の割り込みをマスクし、特定のフラグが割り込みハンドラー登録に渡されない限り、残りの (マスクされていない) 割り込みを再度有効にします。

これは、割り込みハンドラが同じ CPU で競合しないことを意味しますが、SMP / SMT システムの他の CPU で実行されている自身と競合する可能性があり、競合することに注意してください。

于 2012-07-11T06:46:04.097 に答える
2

通常 (少なくとも x86 では)、割り込みは割り込みを無効にします。

割り込みが受信されると、ハードウェアは次のことを行います
。 1. すべてのレジスタを所定の場所に保存します。
2. 命令ポインタ (AKA プログラム カウンタ) を割り込みハンドラのアドレスに設定します。
3. 割り込みを制御するレジスタを、すべて (またはほとんど) の割り込みを無効にする値に設定します。これにより、別の割り込みがこの割り込みに割り込むのを防ぎます。

例外は、無効にできない NMI (ノンマスカブル割り込み) です。

于 2012-07-10T10:33:28.193 に答える
1

はい、大丈夫です。関連性があると思われるものも追加したいと思います。

多くの実際のドライバー/カーネル コードでは、タスクレットやソフト IRQ などの "ボトムハーフ" (bh) ハンドラーがかなり頻繁に使用されます。これらの bh は割り込みコンテキストで実行され、SMP (esp softirq) 上の上位 (th) ハンドラーと並行して実行できます。

もちろん、最近メインラインに向けた動き (主に PREEMPT_RT プロジェクトから移行されたコード) があり、これは基本的に 'bh' メカニズムを取り除きます。すべての割り込みハンドラーはすべての割り込みを無効にして実行されます。それだけでなく、ハンドラはカーネル スレッドに変換されます (変換できます)。これらは、いわゆる「スレッド化された」割り込みハンドラです。

現在のところ、選択は開発者に任されています。「従来の」th/bh スタイルまたはスレッド スタイルを使用できます。

参照と詳細:

http://lwn.net/Articles/380931/

http://lwn.net/Articles/302043/

于 2012-07-11T02:12:21.060 に答える
0

私たちは、ISR がアトミックであることを望んでおり、誰も ISR をプリエンプトできないようにする必要があります。

したがって、ISR はローカル割り込み (つまり、現在のプロセッサの割り込み) を無効にし、ISR が ret_from_intr() 関数を呼び出すと (つまり、ISR が終了すると)、現在のプロセッサで割り込みが再び有効になります。

割り込みが発生すると、他のプロセッサ (SMP システム内) によって処理され、その割り込みに関連する ISR が実行を開始します。

SMP システムでは、適切な同期メカニズム (スピン ロック) を ISR に含める必要もあります。

于 2015-09-22T11:50:24.807 に答える