7. 割り込み
7.1 割り込み
-
割り込み機能により、タイミングを予測できない周辺装置の制御処理を行うことができる
-
割り込みの処理の流れは以下の通り
- 割り込みの発生
- 何らかのきっかけ(割り込み要因)を検出してプログラムの実行を中断する(割り込みが発生)
- 割り込み処理ルーチンの呼び出し
- 割り込み処理ルーチンの実行
- 処理内容は、割り込み要因の種類によって異なる
- 割り込み処理の終了
- 割り込みの発生
-
割り込みの種類
割り込みの種類 発生源 ハードウェア割り込み 周辺機器からの信号によって発生する 例外割り込み トラップ INT、INTO命令の実行によって発生する(ソフトウェア割り込み) フォールト 保護機能、MMUのチェックによって発生する アボート 処理を続けられないエラーが起きた場合に発生する
7.2 ハードウェア割り込み
- ハードウェア割り込みは、486の割り込み入力端子に信号が送られてくることによって発生する割り込み
- 割り込みコントローラが複数の割り込み要因から送られてくる割り込み要求信号を調停して優先度の高いものを1つ選んで486に伝える役割を持っている
- 割り込みコントローラは、486が割り込みを受け付けた後、割り込み要因に対応する割り込み番号をデータバスを通じて486に送る
- 割り込み番号は00HからFFHの256種類
- 486内部のフラグレジスタの第9ビットは割り込み許可フラグと呼ばれ、ハードウェア割り込みの受け付けをコントロールする役割がある
- 割り込み許可フラグを変更する処理はアセンブリ言語で記述する
- CLI(Clear Interrupt Flag)命令は割り込み許可フラグを0にリセットする
- STI(Set Interrupt Enable Flag)命令は割り込み許可フラグを1にセットする
- 割り込み禁止状態のときに信号が送られると、割り込み許可状態になった途端に割り込みが発生する
7.3 例外割り込み
-
トラップ
- ソフトウェア割り込みとも呼ばれる
- マシン語命令のINT、INTO命令が割り込み要因となって発生する
- MS-DOSでは、アプリケーションソフトウェアがオペレーティングシステムやBIOSを呼び出す方法として使われている
-
フォールト
- マシン語命令を実行しているときに検出された例外状態が割り込み要因となって発生する割り込み
- 保護機能に関するフォールトは多くがプログラムの実行を継続するのが困難なため、元のプログラムに戻らず強制終了させる
- メモリ管理に関するフォールトの場合は、適切にメモリを配置しなおせばフォールトの原因になったマシン語命令を実行できるようになる場合があり、その場合は元のプログラムに戻って命令を再実行する
割り込み番号 フォールトの原因 00H 除算エラー 01H デバッカ割り込み 05H 配列境界違反 06H 無効命令 07H コプロセッサ無効 0AH 無効TSS 0BH セグメント不在 0CH スタック例外 0DH 一般保護例外 0EH ページフォールト 10H コプロセッサエラー 11H アラインメントチェック -
アボート
- マシン語命令を実行しているときに検出された例外状態が割り込み要因となって発生する割り込み
- フォールトよりも致命的なエラー
- 例えば、フォールトが発生し、対応する割り込み処理ルーチンが無効なセグメントにあったりした場合
割り込み番号 アボートの原因 08H ダブルフォールト 09H コプロセッサセグメントオーバーラン -
ハードウェア割り込みやトラップに対応する割り込み番号は、20H以上の番号の中から選ぶ
7.4 割り込み処理
- リアルモードでの割り込み処理
- 割り込み番号と割り込み処理ルーチンの対応を割り込みベクタテーブルによって設定する
- 割り込みベクタテーブルは、割り込み処理ルーチンのアドレスを割り込み番号の順に並べておくようになっている
- 割り込みが発生すると、486はフラグ、CS、IPレジスタの値をこの順でスタックにPUSHし、割り込みベクタをロードし割り込み処理ルーチンを実行する
- 割り込み処理ルーチンの末尾ではIRET命令を実行し、スタックからIP、CS、フラグレジスタの値をPOPする
- プロテクトモードでの割り込み処理
- 割り込みディスクリプタテーブル(IDT)を使用し、割り込みが発生すると、割り込み番号に対応する位置にあるゲートが呼び出される
- 割り込みディスクリプタに格納するゲートは、割り込みゲート、トラップゲート、タスクゲートがある
- 割り込み、トラップゲートはコールゲートと同じ構造をしている
- 割り込みゲートは割り込み許可フラグが割り込み禁止状態になる
- ハードウェア割り込みに対応するゲートは、一般に割り込みゲートを使用する
- トラップゲートでは割り込み許可フラグは割り込み前の状態と同じ
- IDTR
- 割り込みディスクリプタを指し示すために使われるレジスタ
- IDTRに値を設定するには、LIDT命令を使う
7.5 ハードウェア割り込みを確認する
- GPE(General Protection Exception)
- 保護機能に違反した命令の実行時には、割り込み番号0DHの一般保護例外(GPE)が発生する
- 一般保護例外では、他の割り込みと違い、フラグレジスタ、CSレジスタ、IPレジスタに加えて、エラーコードがスタックにPUSHされた状態で割り込み処理ルーチンが呼び出される
- エラーコードはIDT、TI(エラーコードがGDTを参照しているか、LDTを参照しているか)、セレクタ値からなり、例外の原因を表している
- シャットダウン
- 割り込みの設定が適切に行われていないときに割り込みが発生したり、割り込みゲートの設定が誤っていて対応する割り込み処理ルーチンに制御を移せなくなってしまったときには、486はシャットダウン状態に入る
- シャットダウン状態になると、486は外部にシャットダウン信号を出力し、シャットダウン検出回路がこれを検出し、リセット回路を働かせる(システム全体を再起動)