プロテクトモードの割り込みでは、リアルモードの割り込みと以下の点が異なります。
- 割り込みベクターテーブルは固定アドレスでなく、割り込みディスクリプタ・テーブル(IDT)を使用し設定する。
- CS,IP,EFLAGSレジスタを待避するスタックが異なる。
- ソフトウェア割り込みの実行権限を設定出来る。
プロテクトモードのベクターテーブルは固定アドレスでしたが、リアルモードの場合は、割り込みディスクリプタ・テーブル(IDT)を定義して、ベクターNoと割り込み/例外処理の対応をつけます。IDTは、GDTやLDTと同じように8バイトのゲート・ディスクリプタの配列になっています。
そして、セグメント機構と同じように、ディスクリプタ・テーブルのアドレスを格納しておくIDTR[Interrupt Descriptor Tbale Register]があり、CPUはこの値を使用して、ディスクリプタ・テーブルにアクセスを行います。
プロテクトモードの割り込み/例外
割り込み/例外処理を行う時、CPUは任意のメモリ上に存在するディスクリプタ・テーブルにアクセスして、割り込みハンドラのアドレスを取得します。ディスクリプタ・テーブルにアクセスためには、CPUはあらかじめディスクリプタ・テーブルのアドレスを知っておく必要があります。
IDTRは、このディスクリプタ・テーブルのアドレスを設定するために使用します。このレジスタに、ディスクリプタ・テーブルのリニアアドレスを設定することによりCPUは、ディスクリプタ・テーブルを参照できるようになります。
IDTR
IDTRのbit構成
bit |
意味 |
詳細 |
0-15 | Table Limit |
ディスクリプタ・テーブルのLimit値
(テーブルのbyte数-1)がセットされる。
|
16-47 | Linear Base Address |
使用するディスクリプタ・テーブルのリニア・アドレス
|
IDTRに値をロードするためには、6バイトのアドレスをメモリ上に値をセットしておき、これをLIDT命令によりIDTRレジスタにロードします。
メモリ上の値は、16bitの範囲(6byteのデータ・オペランドの下位2byte)のLimit値と32bitのベース・アドレス(データ・オペランドの上位4vyte)のLinear Base Addressがレジスタにロードされます。
リアルモードでは、割り込みベクターに記述された、割り込みハンドラのアドレスを介して、ハンドラの処理を行います。プロテクトモードの場合、ゲート・ディスクリプタと呼ばれるデータ構造体を介してハンドラの処理に移行します。
そして、このゲート・ディスクリプタを格納したテーブルを割り込みディスクリプタ・テーブル(IDT)と呼びます。IDTにはゲート・ディスクリプタ最大256エントリー(割り込み/例外ベクターが256番までしかないので、それ以上設定しても無意味)設定出来ます。また256未満のエントリーに設定することができます。
割り込みディスクリプタ・テーブルの構造
IDTには、3種類のゲート・ディスクリプタのいずれかがエントリーされます。
- タスク・ゲート・ディスクリプタ
- 割り込みゲート・ディスクリプタ
- トラップ・ゲート・ディスクリプタ
各ゲート・ディスクリプタの構造は以下のようになります。
ゲート・ディスクリプタの構造
- オフセット
- ハンドラのオフセットアドレス
- セグメントセレクタ
- ハンドラが存在するセグメントセレクタ値
- Pフラグ
- セグメントがメモリ内に存在しているか(P Flag=1)、または存在していないか(P Flag=0)を示す。 このフラグがクリアされていると、セグメント・ディスクリプタを指しているセグメント・セレクタがセグメント・レジスタにロードされると、プロセッサはセグメント不在例外(#NP)を生成する。
- DPL フラグ
- セグメントの特権レベルを指定する。特権レベルは0-3の範囲で指定でき、0が最高の特権レベルである。DPLは、セグメントへの アクセスの制御に使用される。
- D フラグ
- ゲートのサイズ。1=32bit,0=16bit