割り込み
割り込みベクタ
コンピュータシステムの重要な概念の一つに「割り込み」があります
割り込みは、何らかのプログラムの処理中に別のプログラムの処理を一時的に行い
再び元のプログラムに戻る(場合によっては戻らない)ということができます
もし、CPUが常にハードウェアを監視しなければいけないのなら
何らかの処理を行っている場合は、入出力を受け付けることはできません
しかし実際は、CPUが処理中でもキーボードの入力を受け付けることができます
これは、処理中にキーボードが押されるとハードウェア割り込みが発生し
キーボードはCPUに入力があったことを通知します
各ハードウェアの割り込みには、専用のハンドルが割り当てられています
これらのハンドルを割り込みタイプと呼びます
メモリには、1KBに固定されたハンドルに対するテーブルが生成されています
このテーブルは、一つの割り込みタイプに2ワードで対応していて
上位1ワードにセグメント、下位1ワードにオフセットアドレスが格納されています
この割り込みタイプに対応しているテーブルを割り込みベクタと呼びます
割り込みタイプと割り込みベクタは次のように関係しあい
割り込みベクタテーブルは物理アドレスの0番から2ワード単位で構成されています
割り込みタイプ | 割り込みベクタ
|
---|
00 | 00000 - オフセット
|
00002 - セグメント
|
01 | 00004 - オフセット
|
00006 - セグメント
|
02 | 00008 - オフセット
|
00010 - セグメント
|
. . .
|
---|
FF | 003FC - オフセット
|
003FE - セグメント
|
CPUは、割り込みが発生すると現在実行中のセグメントアドレスとオフセットアドレス
すなわち CS : IP のレジスタの内容をスタックに一時保存します
そして、CS : IP それぞれにベクタテーブルのセグメント、オフセットアドレスを設定します
このアドレスには、割り込みタイプに対して処理するべきサブルーチンが格納されています
割り込みルーチンの処理が終了することで、再びもとの処理に復帰します
これが、ハードウェア割り込みの物理的な処理方法です
なぜ割り込みベクタテーブルなどというややこしいものがあるかというと、柔軟性のためです
機種などで、割り込み時に処理するべきサブルーチンがメモリに配置される場所は異なりますが
これならば、ハードウェアは割り込みタイプを入力するだけであり
サブルーチンも位置を割り込みベクタテーブルに記入するだけですみます