リアルモードとプロテクトモード割り込み処理

割り込み処理

割り込みとは

コンピューターに実行中の処理を停止させて、強制的に優先度の高い別の処理を実行させること。
ハードウェア割り込み(外部割込み)とソフトウェア割り込みがある。
コンピューターの資源を有効に活用する為の機能。

ハードウェア割り込み
例)キーボード押下、USBが差し込みなど
ソフトウェア割り込み
例)アラーム、エラー通知など

リアルモードの割り込み

プロテクトモードの割り込み解説する前にリアルモードの割り込みについて。
リアルモードのベクタテーブルは0x00から0x400までの1024バイトと固定的に決まっています。
電源を押した時に始めに起動されるBIOSがPOSTするときに設定されます。

以下リアルモード割込みの概略図。

Linux勉強 パート2 BIOSからブートローダー
リアルモード ウィキペディアの説明 x86プロセッサの起動時の動作モードでありBIOSはこのモードで動作している ウィキペディアにはこうあります。 wiki ウィキペディアてよく知らないことをちょっと知りたいだけで物凄い量...

CPUに割り込みの通知がいくと実行中の処理を一度中断しIP、CS、EFLAGSレジスタをスタックに①退避、割り込みハンドラの番号に合わせて割り込みベクタへ②。
割込みベクタには割込みルーチンのセグメントとオフセットが格納されているのでそれを元に③割り込みルーチンの処理を実行。
割り込み処理が完了したら退避しておいたレジスタの値をスタックからpopして元のプロセスへ④復帰します。

プロテクトモードの割り込み処理

プロテクトモードはリアルモードと違ってベクタテーブルの位置は固定されていません。
なのでIDT(割込みディスクリプタテーブル)を使用し、その先頭アドレスをidtr(割込みディスクリプタテーブルレジスタ)に設定します。
さらにリアルモードと違うのはIDTに並べられているのがゲート・ディスクリプタと呼ばれるデータ構造体であることです。
このゲート・ディスクリプタはOSへアクセスするための関所のようなものでセキュリティー対策を行います。
ここに格納されている割り込みルーチンのベースアドレスとオフセットアドレスを使って割りこみ処理を実行していきます。

割り込みが発生するとまずは処理を停止してレジスタの内容を停止①。idtrのIDTのベースとリミットからIDTを特定②し割り込み番号からゲート・ディスクリプタを読みだして③割り込みルーチンへ。割り込み処理を終わったらスタックからレジスタを復帰して元のプロセスへ戻ります。

idtrにはIDTの場所と大きさを特定するためのベースアドレスとリミットが設定されており、割り込みが発生するとその割り込みハンドラの番号から割り込み処理へ移ります。

IDT

コメント