私はインテルアーキテクチャーを学んでいます。これまでに、いくつかのタイプの割り込みに遭遇しました。
誰もが以下の側面から平易な言葉で彼らの本質的な違いを比較するのを手伝うことができますか?
いくつかの関連スレッド:
当初、x86 CPUには 2つのピン があり、割り込みの着信を通知するために使用できました:[〜#〜] intr [〜#〜](割り込み要求)および[〜#〜] nmi [〜#〜](マスク不可割り込み)
写真は8086チップを示していますが、これらのピンは、Pentium時代にLAPIC(これについては以下で詳しく説明します)として知られているものが導入されるまで立ち往生していました。
[〜#〜] intr [〜#〜]アサートされると、CPUはバスから割り込みベクタ(または割り込み番号)を読み取り、現在のプログラムに割り込み、割り込みベクタに関連付けられた割り込みハンドラの実行を開始します。読んだ。(E)FLAGS
のIF
割り込みフラグ)をクリアすると、_(割り込みをマスクし、CPUが現在のプログラムに割り込むのを防ぎます。
参考までに、[〜#〜] intr [〜#〜]とデバイスの間には、通常、8259A[〜#〜] pic [〜#)とも呼ばれるチップがありました。 〜](プログラム可能な割り込みコントローラー)。
[〜#〜] nmi [〜#〜]アサートされると、CPUは現在のプログラムに割り込み、割り込みベクタ2の割り込みハンドラの実行を開始します。簡単に言えば、[〜#〜] nmi [ 〜#〜]割り込み2を生成します。IF
をクリアしても、[〜#〜] nmi [〜#〜]はマスクされません。[〜#〜] nmi [〜# 〜]ハードウェアのピン:ポート70hのMSbを設定 トリックを実行します 。
[〜#〜] nmi [〜#〜]sの背後にある考え方は、割り込みを2つのカテゴリに分割することです。1つは一般的な割り込みで構成され、1つはシステムの通常の機能の下でデバイスによって使用される割り込みであり、 OSはマスクしたい場合があります。割り込みによって作成された他のカテゴリは、OSがマスクしたくないよりもはるかに深刻です(一時的な状態を除く)。
[〜#〜] nmi [〜#〜]は割り込み2を生成するため、[〜#〜] nmi [〜#〜]は[〜#〜] ivt [〜# 〜](割り込みベクトルテーブル、リアルモードで使用)または[〜#〜] idt [〜#〜](割り込み記述子テーブル、プロテクトモードで使用および関連)。
DOSの時代には、割り込み2ハンドラーがBIOSによって設定され、このベンダー固有のハンドラーは独自のハードウェアレジスタのセットを読み取り、エラー(メモリECCエラー、突然のプラグ解除によるバスエラーなど)を検出し、回復を試みました。 (リセットや メモリスクラビング のように)。
OSがBIOSと連携して動作し、[〜#〜] nmi [〜#〜]に影響を与えずにcli
を実行できるため、このメカニズムは当時は理にかなっています。
プロテクトモードの出現により、リアルモード用に作成されたBIOS割り込み2ハンドラーは役に立たなくなりました。
一部のカーネルは、[〜#〜] nmi [〜#〜]割り込みが生成されるため、カーネルウォッチドッグタイマーの実装に[〜#〜] nmi [〜#〜]を使用しましたcli
の後でも。
Intelは、新しい実行モードをCPUに追加できるため、割り込みを使用してファームウェアを制御することはもはや解決策ではなく、より透過的な解決策が必要であることを認識しました。
そこで彼らはSMM(システム管理モード)を作成しました。
通常の割り込みとは異なり、SMMはCPUの特別なモードであり、Intelのマニュアル2の第34章を引用しています。
SMMがシステム管理割り込み(SMI)を介して呼び出されると、プロセッサはプロセッサの現在の状態(プロセッサのコンテキスト)を保存してから、新しいアドレス空間によって定義された別の動作環境に切り替えます。システム管理ソフトウェアエグゼクティブ(SMIハンドラー)はその環境で実行を開始し、SMIハンドラーの重要なコードとデータはそのアドレス空間内の物理メモリ領域(SMRAM)に存在します。 SMMでは、プロセッサはSMIハンドラコードを実行して、未使用のディスクドライブまたはモニターの電源を切る、独自のコードを実行する、システム全体を一時停止状態にするなどの操作を実行します。 SMIハンドラーが操作を完了すると、再開(RSM)命令を実行します。
入力するには、[〜#〜] smm [〜#〜]a [〜#〜] smi [〜#〜](システム管理割り込み)を生成する必要があります
SMMに入る唯一の方法は、プロセッサのSMI#ピンまたはAPICバスを介して受信したSMIメッセージを介してSMIを通知することです。
一方、[〜#〜] i [〜#〜]in [〜#〜] smi [〜#〜]は割り込みSMI#勝ち)をアサートします。 t上記の意味で割り込みを生成します。
[〜#〜] smi [〜#〜]は、プロテクトモードが普及し始めたときに、386の新しいバージョンで導入されました。
ハードウェアインターフェイスを透過的に変換するために使用されています。たとえば、Intelチップセットは、ポート60h〜64hに順番にアクセスしたときに[〜#〜] smi [〜#〜]を生成するようにプログラムできます。 USBデバイスのレガシーサポートを提供します。
これらは、マウスとキーボードを処理するための標準のPS2ポートです。 SMMコードは、ポート60h〜64hの値を透過的に読み取り、それらのアクセスをUSBアクセスに適切に変換します。
Pentiumの登場により、IntelはLAPIC(Local Advanced Programmable Interrupt Controller)、[〜#〜] intr [〜#〜]および[〜#〜] nmi [〜#〜]なくなり、LINT0およびLINT1(ローカル割り込み)に置き換えられます。
LINT0およびLINT1はプログラム可能なピン、Intelのマニュアル2の第10章から):
リセット時にLINT0は[〜#〜] intr [〜#〜]およびLINT1as [〜#〜] nmi [〜#〜]として構成されます) 。
割り込みのルーティングと優先順位の付与の複雑さは、CPU外部のハードウェアに移されました。
すべてのデバイスまたはプラットフォームはカスタム配線を使用しました。たとえば、 PCIデバイスには割り込み用のピンが交差していました 汚染を最小限に抑えます。 階層レイアウトを備えたIOAPIC および[MSI]( https://en.wikipedia.org/wiki/Message_Signaled_Interrupts )の出現により、より多くの機能レイヤーが追加されました。割り込みの処理。
一方、[〜#〜] smi [〜#〜]を使用してOSを管理上の決定から除外することは、良い考えではないことが認識されました。
OSは、プロセッサまたはデバイスを無効化または抑制したり、レポート、ログ、シャットダウンを実行したりできます。
ファームウェアからの標準化された有益なサポートなしでハードウェアを扱うことの複雑さと、OSを管理手順の一部にする必要性はACPI仕様で最高潮に達しました。
[〜#〜] smm [〜#〜]のようなOSの非表示モードに依存する代わりに、ACPIは解釈可能なバイトコード([〜#〜] aml [〜#〜])を定義します。
OSは実行を担当し、ファームウェア開発者はそれを作成する責任があります。
ACPI設計者は、通常の割り込み[〜#〜] sci [〜#〜](システム制御割り込み)を使用してOSの注意を要求することを決定しました。この割り込みは、任意の方法で通知できますが、必須です。ファームウェアではなくOSによって処理されます。
ACPI仕様の引用:
デバイスはSCIに信号を送り、OSに電源ステータスの変化を通知できます。たとえば、デバイスは割り込みをトリガーして、バッテリーが低電力レベルに達したことをOSに通知できます。
SCIは通常の割り込みであり、そのベクトル(読み取り:数値)はACPIテーブル/構造の1つで報告されます。
SCIベクトルは、チップセットをプログラミングすることで構成できます。データシート/テーブルを最後に読んだときに使用した一般的な値は9でした。
[〜#〜] sci [〜#〜]の場合、OSは通常、そのような割り込みのソースを判別し、適切なアクションを実行します。通常、これには、プロセスでいくつかのAMLコードの実行が含まれます。
ハードウェア割り込みは、「生成された」の意味に応じて、2つの方法でソフトウェアによって「生成」されます。
ソフトウェアはハードウェアを「刺激」することができます。
たとえば、タイマーは、割り込みをトリガーするためにすぐに期限切れになるようにプログラムできます。
これは、上記の中断ソースのいずれかで使用できます。NMI/ SMIは少し注意が必要です。LINT0を適切にプログラムする必要があります。
ソフトウェアは割り込みハンドラを実行できます。これはすべての割り込みソースで実行できますが、[〜#〜] smi [〜#〜]、[〜#〜] smi [〜#〜]はハードウェアイベントでのみ入力できます。 [〜#〜] smm [〜#〜]コードが存在するメモリは、[〜#〜] smm [〜#〜]にない場合はマップされません。
OSは通常、特定のハードウェアステータスでハードウェア割り込みが生成されることを想定していることに注意してください。原因が見つからない場合、割り込みは通常スプリアスとして分類され、すべてのOS /ハンドラがスプリアス割り込みを適切に処理するわけではありません。
第3インテルマニュアルの第6.9章は、割り込みの優先順位を報告しています
1 (Highest) Hardware Reset and Machine Checks
- RESET
- Machine Check
2 Trap on Task Switch
- T flag in TSS is set
3 External Hardware Interventions
- FLUSH
- STOPCLK
- SMI
- INIT
4 Traps on the Previous Instruction
- Breakpoints
- Debug Trap Exceptions (TF flag set or data/I-O breakpoint)
5 Nonmaskable Interrupts (NMI)
6 Maskable Hardware Interrupts
7 Code Breakpoint Fault
8 Faults from Fetching Next Instruction
- Code-Segment Limit Violation
- Code Page Fault
9 Faults from Decoding the Next Instruction
- Instruction length > 15 bytes
- Invalid Opcode
- Coprocessor Not Available
10 (Lowest) Faults on Executing an Instruction
- Overflow
- Bound error
- Invalid TSS
- Segment Not Present
- Stack fault
- General Protection
- Data Page Fault
- Alignment Check
- x87 FPU Floating-point exception
- SIMD floating-point exception
- Virtualization exception
したがって、SCIが単なる通常の割り込みであることを考慮すると、順序付けは次のようになります。
通常の割り込み/ SCI <NMI <SMI
この順序は、「同じ」時間に複数の割り込みが発生した場合に使用されることに注意してください。
NMIを提供している間、またはSMIにいる間は、通常の/ SCI割り込みを有効にして提供することができます。