割り込み記述子テーブル( IDT ) は、 x86アーキテクチャが割り込みベクター テーブルを実装するために使用するデータ構造です。プロセッサは、IDT を使用して、割り込みや例外が発生したときに実行されるハンドラーのメモリ アドレスを決定します。
以下の説明の詳細は、特に x86 アーキテクチャに適用されます。他のアーキテクチャでは同様のデータ構造を持ちますが、動作が異なる場合があります。
IDT は 256 個の割り込みベクターで構成され、IDT の使用は、プロセッサ例外、ハードウェア割り込み、ソフトウェア割り込みの 3 種類のイベントによってトリガーされます。これらをまとめて割り込みと呼びます。
- CPUによって生成されるプロセッサ例外は、最初の32個までの割り込みベクターに固定マッピングされます。 [1] 32個のベクター(0x00-0x1f)は正式に予約されており(その多くは新しいプロセッサで使用されています)、オリジナルの8086では最初の5個(0-4)の割り込みベクターのみが使用され、IBM PC IDTレイアウトでは予約範囲が考慮されませんでした。
- ハードウェア割り込みベクター番号は、ハードウェア IRQ 番号に対応しています。正確なマッピングは、Intel 8259などのプログラマブル割り込みコントローラがどのようにプログラムされているかによって異なります。[2] Intel は IRQ 0-7 をベクター 0x20-0x27 にマッピングするように文書化していますが、IBM PC および互換機はそれらを 0x08-0x0F にマッピングしています。IRQ 8-15 は通常、ベクター 0x70-0x77 にマッピングされます。
- ソフトウェア割り込みベクター番号は、IBM PC BIOS、DOS、その他のオペレーティング システムなどの特定のランタイム環境によって定義されます。ソフトウェアはINT命令を使用して (アプリケーション、デバイス ドライバー、またはその他の割り込み ハンドラーによって) トリガーします。たとえば、IBM PC BIOS はベクター 0x10 でビデオ サービスを提供し、MS-DOS はベクター 0x21 でDOS APIを提供し、Linux はベクター 0x80 で syscall インターフェイスを提供します。
リアルモード
リアルモードでは、割り込みテーブルは IVT (割り込みベクターテーブル) と呼ばれます。80286 までは、IVT は常にメモリ内の同じ場所に常駐し、範囲は から で0x0000、0x03ff256 個のfar ポインタで構成されていました。ハードウェア割り込みは、プログラマブル割り込みコントローラを介して任意のベクターにマッピングできます。80286 以降では、保護モードで IDT (割り込み記述子テーブル) と同じ方法(つまり、LIDT (割り込み記述子テーブルレジスタのロード) 命令経由) で IVT のサイズと場所を変更できますが、その形式は変更されません。[3]
BIOS割り込み
BIOS は、割り込みハンドラを登録することで、ハードウェア機能のサブセットへの簡単なリアルモード アクセスを提供します。割り込みハンドラは、 INTアセンブリ命令によってソフトウェア割り込みとして呼び出され、パラメータはレジスタを介して渡されます。これらの割り込みは、システムメモリ レイアウトの検出、VGA出力とモードの構成、ブート プロセスの早い段階でのディスク へのアクセスなど、さまざまなタスクに使用されます。
保護されたロングモード
IDT は、メモリに連続して格納され、ベクター番号でインデックス付けされた記述子の配列です。すべての可能なエントリを使用する必要はありません。使用される最高の割り込みベクターまでテーブルにデータを入力し、IDTRそれに応じて IDT の長さの部分を設定するだけで十分です。
IDTRレジスタは、IDTの線形ベースアドレスと制限(バイト長から1を引いた値)の両方を格納するために使用されます。割り込みが発生すると、プロセッサは割り込みベクターをエントリサイズ(保護モードの場合は8、ロングモードの場合は16)で乗算し、その結果をIDTベースアドレスに追加します。[4]アドレスがテーブル内にある場合、DPLがチェックされ、ゲートタイプに基づいて割り込みが処理されます。
記述子は、割り込みゲート、トラップゲート、または 32 ビット保護モードのみのタスクゲートのいずれかです。割り込みゲートとトラップゲートは、セグメント ( GDTまたはLDTのいずれかに存在) とそのセグメント内のオフセットの両方を指定することにより、実行するコードを含むメモリ位置を指します。トラップゲートと割り込みゲートの唯一の違いは、割り込みゲートはマスク可能なハードウェア割り込みのプロセッサによるそれ以上の処理を無効にするため、ハードウェア生成の割り込みの処理に適していることです (逆に、トラップゲートはソフトウェア割り込みと例外の処理に役立ちます)。タスクゲートは、現在アクティブなタスク状態セグメントを切り替え、ハードウェアタスクスイッチメカニズムを使用して、プロセッサの使用を別のプログラム、スレッド、またはプロセスに効果的に引き渡します。
一般的なIDTレイアウト
インテル公式レイアウト
0x0から0x1FまでのすべてのINT_NUMは、Intelによって例外用に予約されています。[5] 0x1Fより大きいINT_NUMは割り込みルーチンに使用されます。
IBM PC レイアウト
IBM PC ( BIOSおよびMS-DOSランタイム) は、オリジナルの 8086 で実装された最初の 5 つの例外ベクトル以外については、公式の Intel レイアウトに従っていません。割り込み 5 はすでにPrint Screenキーの処理に使用されており、IRQ 0-7 は INT_NUM 0x08-0x0F にマップされており、BIOS は 0x10-0x1F の範囲のほとんどのベクトルを API の一部として使用しています。[6]
フッキング
一部のWindowsプログラムはIDTへの呼び出しをフックします。これには、IDTへの呼び出しをインターセプトし、独自の処理を追加するカーネルモードドライバーの作成が含まれます。これはMicrosoftによって公式にサポートされたことはありませんが、 64ビットバージョンのWindowsまでは、オペレーティングシステム上でプログラム的に防止されていませんでした。64ビットバージョンのWindowsでは、カーネルモードフックを使用しようとするドライバーにより、マシンがバグチェックを実行します。[7]
参照
参考文献
- ^ 「例外 - OSDev Wiki」. wiki.osdev.org . 2021年4月17日閲覧。
- ^ Friesen, Brandon. 「IRQ と PIC」。Branのカーネル開発チュートリアル。2024年6 月 6 日閲覧。
- ^ Intel® 64 および IA-32 アーキテクチャ ソフトウェア デベロッパーズ マニュアル、20.1.4 割り込みと例外処理
- ^ Intel® 64 および IA-32 アーキテクチャ ソフトウェア デベロッパーズ マニュアル、6.12.1 例外または割り込みハンドラ プロシージャ
- ^ 「例外 - OSDev Wiki」. wiki.osdev.org . 2021年4月17日閲覧。
- ^ Jurgens, David. 「システム BIOS/DOS によって実装された割り込みテーブル」。HelpPCリファレンス ライブラリ。2024年6 月 6 日閲覧。
- ^ 「x64 ベース システムのパッチ ポリシー」。Microsoft。
オペレーティング システムがこれらの変更またはその他の不正なパッチを検出すると、バグ チェックを生成し、システムをシャットダウンします。
- 一般的な
- Intel 64 および IA-32 アーキテクチャ ソフトウェア開発者マニュアル、第 3 巻: システム プログラミング ガイド
外部リンク
- Intel 64 および IA-32 アーキテクチャ ソフトウェア デベロッパーズ マニュアル、第 3A 巻:システム プログラミング ガイド、パート 1 (第 5 章「割り込みと例外の処理」および第 10 章「高度なプログラマブル割り込みコントローラ」を参照)]
- OSDev.org の割り込み記述子テーブル
