割り込みハンドラを呼び出す前に、CPU はローカル CPU のすべての割り込みを無効にしますか? それとも、提供されている特定の割り込みラインのみを無効にしますか?
5 に答える
x86 は、割り込みベクトルにジャンプする前に、すべてのローカル割り込み (もちろん NMI を除く) を無効にします。Linux は通常、特定の割り込みをマスクし、特定のフラグが割り込みハンドラー登録に渡されない限り、残りの (マスクされていない) 割り込みを再度有効にします。
これは、割り込みハンドラが同じ CPU で競合しないことを意味しますが、SMP / SMT システムの他の CPU で実行されている自身と競合する可能性があり、競合することに注意してください。
通常 (少なくとも x86 では)、割り込みは割り込みを無効にします。
割り込みが受信されると、ハードウェアは次のことを行います
。 1. すべてのレジスタを所定の場所に保存します。
2. 命令ポインタ (AKA プログラム カウンタ) を割り込みハンドラのアドレスに設定します。
3. 割り込みを制御するレジスタを、すべて (またはほとんど) の割り込みを無効にする値に設定します。これにより、別の割り込みがこの割り込みに割り込むのを防ぎます。
例外は、無効にできない NMI (ノンマスカブル割り込み) です。
はい、大丈夫です。関連性があると思われるものも追加したいと思います。
多くの実際のドライバー/カーネル コードでは、タスクレットやソフト IRQ などの "ボトムハーフ" (bh) ハンドラーがかなり頻繁に使用されます。これらの bh は割り込みコンテキストで実行され、SMP (esp softirq) 上の上位 (th) ハンドラーと並行して実行できます。
もちろん、最近メインラインに向けた動き (主に PREEMPT_RT プロジェクトから移行されたコード) があり、これは基本的に 'bh' メカニズムを取り除きます。すべての割り込みハンドラーはすべての割り込みを無効にして実行されます。それだけでなく、ハンドラはカーネル スレッドに変換されます (変換できます)。これらは、いわゆる「スレッド化された」割り込みハンドラです。
現在のところ、選択は開発者に任されています。「従来の」th/bh スタイルまたはスレッド スタイルを使用できます。
参照と詳細:
私たちは、ISR がアトミックであることを望んでおり、誰も ISR をプリエンプトできないようにする必要があります。
したがって、ISR はローカル割り込み (つまり、現在のプロセッサの割り込み) を無効にし、ISR が ret_from_intr() 関数を呼び出すと (つまり、ISR が終了すると)、現在のプロセッサで割り込みが再び有効になります。
割り込みが発生すると、他のプロセッサ (SMP システム内) によって処理され、その割り込みに関連する ISR が実行を開始します。
SMP システムでは、適切な同期メカニズム (スピン ロック) を ISR に含める必要もあります。