プロテクトモードの割り込み/例外

プロテクトモードの割り込みでは、リアルモードの割り込みと以下の点が異なります。

プロテクトモードのベクターテーブルは固定アドレスでしたが、リアルモードの場合は、割り込みディスクリプタ・テーブル(IDT)を定義して、ベクターNoと割り込み/例外処理の対応をつけます。IDTは、GDTやLDTと同じように8バイトのゲート・ディスクリプタの配列になっています。

そして、セグメント機構と同じように、ディスクリプタ・テーブルのアドレスを格納しておくIDTR[Interrupt Descriptor Tbale Register]があり、CPUはこの値を使用して、ディスクリプタ・テーブルにアクセスを行います。

プロテクトモードの割り込み/例外
プロテクトモードの割り込み/例外

IDTR[Interrupt Descriptor Tbale Register]

割り込み/例外処理を行う時、CPUは任意のメモリ上に存在するディスクリプタ・テーブルにアクセスして、割り込みハンドラのアドレスを取得します。ディスクリプタ・テーブルにアクセスためには、CPUはあらかじめディスクリプタ・テーブルのアドレスを知っておく必要があります。

IDTRは、このディスクリプタ・テーブルのアドレスを設定するために使用します。このレジスタに、ディスクリプタ・テーブルのリニアアドレスを設定することによりCPUは、ディスクリプタ・テーブルを参照できるようになります。

IDTR
IDTR
IDTRのbit構成
bit 意味 詳細
0-15Table Limit ディスクリプタ・テーブルのLimit値
(テーブルのbyte数-1)がセットされる。
16-47Linear Base Address 使用するディスクリプタ・テーブルのリニア・アドレス

LIDT命令

IDTRに値をロードするためには、6バイトのアドレスをメモリ上に値をセットしておき、これをLIDT命令によりIDTRレジスタにロードします。

メモリ上の値は、16bitの範囲(6byteのデータ・オペランドの下位2byte)のLimit値と32bitのベース・アドレス(データ・オペランドの上位4vyte)のLinear Base Addressがレジスタにロードされます。

割り込みディスクリプタ・テーブル(IDT)

リアルモードでは、割り込みベクターに記述された、割り込みハンドラのアドレスを介して、ハンドラの処理を行います。プロテクトモードの場合、ゲート・ディスクリプタと呼ばれるデータ構造体を介してハンドラの処理に移行します。

そして、このゲート・ディスクリプタを格納したテーブルを割り込みディスクリプタ・テーブル(IDT)と呼びます。IDTにはゲート・ディスクリプタ最大256エントリー(割り込み/例外ベクターが256番までしかないので、それ以上設定しても無意味)設定出来ます。また256未満のエントリーに設定することができます。

割り込みディスクリプタ・テーブルの構造
割り込みディスクリプタ・テーブルの構造

IDT ディスクリプタ

IDTには、3種類のゲート・ディスクリプタのいずれかがエントリーされます。

各ゲート・ディスクリプタの構造は以下のようになります。

ゲート・ディスクリプタの構造
ゲート・ディスクリプタの構造
オフセット
ハンドラのオフセットアドレス
セグメントセレクタ
ハンドラが存在するセグメントセレクタ値
Pフラグ
セグメントがメモリ内に存在しているか(P Flag=1)、または存在していないか(P Flag=0)を示す。 このフラグがクリアされていると、セグメント・ディスクリプタを指しているセグメント・セレクタがセグメント・レジスタにロードされると、プロセッサはセグメント不在例外(#NP)を生成する。
DPL フラグ
セグメントの特権レベルを指定する。特権レベルは0-3の範囲で指定でき、0が最高の特権レベルである。DPLは、セグメントへの アクセスの制御に使用される。
D フラグ
ゲートのサイズ。1=32bit,0=16bit
Last modified: Thu Jan 24 16:11:46 2008 JST