x86 での割り込みと、カーネルが割り込みハンドラーを使用してさまざまな割り込みを処理する方法について調査してきました。しかし、1つのことが私を混乱させます。
割り込みは、ディスクやタイマーの割り込みなどのハードウェアで生成される可能性があること、またはページ フォールト、ゼロ除算の例外などの CPU 例外である可能性があることを知っています。 - 特に 0F)。たとえば、Ralf Brown のリストによると、INT 09h 割り込みは、KEYBOARD DATA READY
ハードウェア割り込みとCOPROCESSOR SEGMENT OVERRUN
例外の両方を兼ねています。
だから私の質問は、これらのような割り込みが与えられた場合、割り込みハンドラーはどの割り込みを処理するかをどのように知るのですか?
1 に答える
x86 では通常、ハードウェア割り込みとソフトウェア割り込みを区別する方法が提供されていません。例外ハンドラーは、外部ハードウェアまたはその他の手段を照会して、2 つのケースを明確にする必要があります。
混乱を避けるために、システムは、対応する割り込み記述子テーブル エントリに特権レベルを設定することで、同じベクトルのオーバーロードを防ぐことができます。ユーザーモード (CPL=3) の INT 命令は、特権ベクトルでソフトウェア例外を生成できません。
いくつかの例外では、プロセッサは追加のエラー コード ワードを例外スタック フレームにプッシュします。エラー コード フィールドには、例外が外部割り込みによって発生したかどうかを示すビット「EXT」があります。IA マニュアル第 3 巻のセクション 6.13 には、次のように記載されています。
EXT 外部イベント (ビット 0) — 設定されている場合、割り込みや以前の例外など、プログラム外部のイベントの配信中に例外が発生したことを示します。
ただし、少数の例外のみがエラー コード フィールドをプッシュし、これらはすべてベクター 32 未満のプロセッサ例外です。
- 編集 -
もう 1 つ: 「トラップ ゲート」と「割り込みゲート」に惑わされないでください。割り込みはトラップ ゲートを通過でき、INT は割り込みゲートを通過できます。唯一の違いは、ハンドラ関数へのエントリでの割り込みイネーブル状態の処理です。