• 検索結果がありません。

プロセッサには、割り込みと例外という、プログラム実行を中断するためのメカニズ ムが

2

つある。

割り込みは、一般的に

I/O

デバイスでトリガされる非同期イベントである。

例外は、プロセッサが、命令実行時に、あらかじめ定義されている条件を検出し た場合に生成される同期イベントである。

IA

では、フォルト、トラップ、アボー トという

3

クラスの例外を指定している。

プロセッサは、割り込みや例外に対して基本的には同じ方法で応答する。すなわち、

割り込みあるいは例外が通知されると、プロセッサは現在実行されているプログラム またはタスクを停止し、割り込みあるいは例外の処理専用に作成されたハンドラ・プ ロシージャに切り替える。プロセッサは、割り込みディスクリプタ・テーブル(

IDT

) 内のエントリを介してハンドラ・プロシージャにアクセスする。このハンドラが割り 込みあるいは例外の処理を完了すると、割り込みをかけられたプログラムまたはタス クにプログラムの制御が戻される。

オペレーティング・システム、エグゼクティブ、デバイスドライバなどは、通常は、

割り込みや例外をアプリケーション・プログラムやタスクからは独立して処理する。

プロシージャ・コール、 割り込み、例外

6

ただし、アプリケーション・プログラムでは、アセンブリ言語のコールを介して、オ ペレーティング・システムやエグゼクティブに組み込まれている割り込みハンドラや 例外ハンドラにアクセスできる。本節の以降では、プロセッサが持つ割り込みならび に例外の処理機構について簡単に説明する。この機構の詳しい説明については、『

IA-32

インテル®アーキテクチャ・ソフトウェア・デベロッパーズ・マニュアル、下巻』

の第

5

章「割り込みと例外の処理」を参照のこと。

IA-32

アーキテクチャでは、

17

のプロセッサ定義の割り込みと例外、

224

のユーザ定義 の割り込みがあらかじめ定義されている。これらの割り込みや例外は、

IDT

内のエン トリに関連付けられている。

IDT

内の割り込みや例外はそれぞれ、ベクタと呼ばれる 番号で識別される。表

6-1.

に、割り込みと例外を、

IDT

内のエントリならびにそれぞ れに対応するベクタ番号と共に併記する。ベクタ

0

8

10

14

16

19

は、定義済 みの割り込みと例外である。ベクタ

32

255

は、ユーザ定義の割り込みであり、これ らはマスク可能割り込みと呼ばれる。

プロセッサには、IDT内のエントリをポイントしない割り込みがいくつか定義されて いることに注意しなければならない。この種の割り込みで最も注意しなければならな いのが、SMI割り込みである。IA-32アーキテクチャがサポートする割り込みと例外 の詳細については、『IA-32 インテル®

アーキテクチャ・ソフトウェア・デベロッパー

ズ・マニュアル、下巻』の第

5

章「割り込みと例外の処理」を参照のこと。

割り込みあるいは例外を検出すると、プロセッサは次のいずれかの動作を行う。

ハンドラ・プロシージャを暗黙的にコールする。

ハンドラタスクを暗黙的にコールする。

6.4.1.

割り込み

/

例外処理プロシージャのコール操作とリターン操作

割り込みあるいは例外ハンドラ・プロシージャのコールは、異なる保護レベルに対す るプロシージャ・コールに似ている(

6.3.6.

項「特権レベル間のコール操作とリター ン操作」を参照)。割り込みあるいは例外ハンドラ・プロシージャのコールにおいて は、割り込みベクタが

2

種のゲート(割り込みゲートかトラップゲート)のいずれか を参照する。割り込みゲートとトラップゲートは、次の情報を保持する点でコール ゲートに似ている。

アクセス権に関する情報

ハンドラ・プロシージャを格納しているコード・セグメントのセグメント・セレ クタ

ハンドラ・プロシージャの最初の命令へのコード・セグメントのオフセット 割り込みゲートとトラップゲートとは、次の点で異なる。割り込みハンドラあるいは 例外ハンドラが割り込みゲートを介してコールされた場合は、プロセッサは

EFLAGS

IA-32 インテル® アーキテクチャ・ソフトウェア・デベロッパーズ・マニュアル 上巻:基本アーキテクチャ

6-14

レジスタ内の割り込み許可フラグ(

IF

)をクリアし、これ以降の割り込みによってハ ンドラの実行が妨害されるのを防ぐ。一方、ハンドラがトラップゲートを介してコー ルされた場合は、

IF

フラグのステートは変更されない。

1. UD2命令は、インテル® Pentium® Proプロセッサで初めて導入された。

2. Intel386™プロセッサ以降のIAプロセッサでは、この例外は生成されない。

3. この例外は、Intel486™プロセッサで初めて導入された。

4. この例外は、インテル® Pentium®プロセッサで初めて導入され、P6 ファミリ・プロセッサで拡張された。

5.この例外は、インテル® Pentium® IIIプロセッサで初めて導入された。

表6-1. 例外と割り込み ベクタ

番号

ニーモ

ニック 説明 原因

0 #DE 除算エラー DIV命令とIDIV命令。

1 #DB デバッグ 任意のコードやデータの参照。

2 NMI マスク不可能な外部割り込み。

3 #BP ブレークポイント INT 3命令。

4 #OF オーバーフロー INTO命令。

5 #BR BOUND範囲外 BOUND命令。

6 #UD 無効オペコード(未定義オペコード) UD2命令または予約オペコード。1 7 #NM デバイス使用不可能(数値演算コプロ

セッサなし)

浮動小数点命令またはWAIT/FWAIT命令。

8 #DF ダブルフォルト 例外、NMI、またはINTRを生成できる任 意の命令。

9 #MF コプロセッサ・セグメント・オーバー ラン(予約)

浮動小数点命令。2

10 #TS 無効TSS タスクスイッチまたはTSSアクセス。

11 #NP セグメント不在 セグメント・レジスタのロードまたはシス テム・セグメントのアクセス。

12 #SS スタック・セグメントのフォルト スタック操作とSSレジスタのロード。

13 #GP 一般保護 任意のメモリ参照と、その他の保護チェッ ク。

14 #PF ページフォルト 任意のメモリ参照。

15 予約済み

16 #MF 浮動小数点エラー(数値演算フォルト) 浮動小数点命令またはWAIT/FWAIT命令。

17 #AC アライメント・チェック メモリ内の任意のデータ参照。3 18 #MC マシンチェック エラーコード(存在する場合)、および

ソースがモデルに依存。4 19 #XF SIMD浮動小数点例外5 SIMD浮動小数点命令。

20-31 予約済み

32-255 マスク可能割り込み INTRピンによる外部割り込みまたはINT

n命令。

プロシージャ・コール、 割り込み、例外

6

ハンドラ・プロシージャのコード・セグメントが、現在実行されているプログラムま たはタスクと同じ特権レベルを持つ場合は、ハンドラ・プロシージャは現在のスタッ クを使用する。ハンドラの特権レベルの方が高い場合は、プロセッサはハンドラの特 権レベル用のスタックに切り替える(スタックスイッチ)。

スタックスイッチが生じなかった場合は、割り込みあるいは例外のハンドラをコール するときに、プロセッサは次の動作を行う(図

6-5.

を参照)。

1. EFLAGS、CS、および EIP の各レジスタの現在値を、この順序でスタックにプッシュ

する。

2. 該当する場合には、エラーコードをスタックにプッシュする。

3. 新しいコード・セグメントのセグメント・セレクタと(割り込みゲートかトラップゲー トからの)新しい命令ポインタを、それぞれCSレジスタとEIPレジスタにロードする。

4. コールが割り込みゲートを介する場合は、EFLAGSレジスタ内のIFフラグをクリアす る。

5. 新しい特権レベルで、ハンドラ・プロシージャの実行を開始する。

図6-5. 割り込み/例外処理ルーチンへの移行時のスタックの使用法

CS エラーコード

EFLAGS CS EIP

ハンドラへの移行後のESP

エラーコード ハンドラへの

移行前のESP

EFLAGS EIP SS ESP 特権レベルに変更がない場合の

スタックの使用法

特権レベルが変更される場合の スタックの使用法 割り込まれたプロシージャ

割り込まれたプロシージャ とハンドラのスタック

ハンドラのスタック

ハンドラへの 移行後のESP

ハンドラへの移行前のESP

のスタック

IA-32 インテル® アーキテクチャ・ソフトウェア・デベロッパーズ・マニュアル 上巻:基本アーキテクチャ

6-16

スタックスイッチが生じた場合は、プロセッサは次の動作を行う。

1. SS、ESP、EFLAGS、CS、EIPの各レジスタの現在値を一時的に内部にセーブする。

2. TSS に格納されている新しいスタック(すなわち、現在コールされている特権レベル

用のスタック)のセグメント・セレクタとスタックポインタをSSレジスタとESPレジ スタにロードし、新しいスタックに切り替える。

3. 割り込みをかけられたプロセッサのスタックに対して一時的にセーブしておいた SS、

ESP、EFLAGS、CS、EIPの各値を、この新しいスタックにプッシュする。

4. 該当する場合には、エラーコードを新しいスタックにプッシュする。

5. 新しいコード・セグメントのセグメント・セレクタと(割り込みゲートかトラップゲー トからの)新しい命令ポインタを、それぞれCSレジスタとEIPレジスタにロードする。

6. コールが割り込みゲートを介する場合は、EFLAGSレジスタ内のIFフラグをクリアす る。

7. 新しい特権レベルで、ハンドラ・プロシージャの実行を開始する。

割り込みあるいは例外のハンドラからのリターンは、IRET命令で開始する。IRET命 令は、割り込みをかけられたプロシージャに対して

EFLAGSレジスタの内容も同時に

リストアすることを除けば、

far

リターン命令と同じである。割り込みハンドラあるい は例外ハンドラからのリターンを、割り込みをかけられたプロシージャと同じ特権レ ベルで実行する場合は、プロセッサは次の動作を実行する。

1. CSレジスタとEIPレジスタに、割り込みあるいは例外が発生する前の値をリストアす

る。

2. EFLAGSレジスタに元の値をリストアする。

3. スタックポインタを正しくインクリメントする。

4. 割り込みをかけられたプロシージャの実行を再開する。

割り込みハンドラあるいは例外ハンドラからのリターンを、割り込みをかけられたプロ シージャとは異なる特権レベルで実行する場合は、プロセッサは次の動作を実行する。

1. 特権チェックを行う。

2. CSレジスタとEIPレジスタに、割り込みあるいは例外が発生する前の値をリストアす

る。

3. EFLAGSレジスタに元の値をリストアする。

4. SSレジスタとESPレジスタに、割り込みあるいは例外が発生する前の値をリストアす

る。これで、スタックが、割り込みをかけられたプロシージャのスタックに切り替わる。

5. 割り込みをかけれらたプロシージャの実行を再開する。