割り込みと例外
プロセサ本体と比べると著しく速度の遅いI/Oの動作完了や、キーボードや通信インタフェースからの入力の到着のように、プログラム中の命令の実行と非同期に発生する事象を処理するために割り込みという方法が使われる。
割り込み処理機構は、当初は、このようなプロセサの外部から入力される事象を処理する目的で設けられたが、その後、前記の特権違反や、ゼロでの割り算などのプログラムの実行に伴ってプロセサ内部で発生する異常な事象に対処するためにも用いられるように拡張されてきている。そして、これらを総称してトラップ(Trap)という名称が使われる。また、外部からの事象と内部からの事象を区別する場合は、外部からのものを割り込み(Interrupt)、内部からのものを例外(Exception)と呼ぶ。
プロセサに割り込み信号が到着すると、割り込み処理機構は、プログラムカウンタやキーとなる若干のハードウェアレジスタを退避して、テーブルで割り込みの種類別に指定されたアドレスをプログラムカウンタに設定して、そのアドレスから命令の実行を開始する。一般に、このアドレスは割り込み処理ルーチンの先頭アドレスである。そして、割り込み処理ルーチンでは、(1)その中で使用するレジスタの退避、(2)割り込みに対応して必要となる処理の実行、そして、(3)退避したレジスタを復元して、割り込み前に実行されていたプログラムに戻って実行を継続する。また、ユーザとスーパバイザ状態の区別のあるプロセサでは、これに加えて、割り込みや例外を受信すると、割り込み処理機構はプロセサをスーパバイザ状態に切り替えて割り込み処理を行い、割り込み前に実行していたプログラムに戻る直前で、ユーザ状態に戻す。
例外の場合の処理もほぼ同様であるが、TLBミス例外のように、例外処理の中でページテーブルウオークを行って目的のエントリをTLBに入れ、再度、例外を発生したメモリアクセス命令を実行するために、例外を発生した命令に戻るケースと、ハードウェアでサポートしていない命令を例外処理ルーチンでエミュレーションして処理するケースのように、例外を発生した命令の次の命令に戻るケースがある。
ユーザ状態で実行できる命令として、異常事態ではないが意図的に例外を発生させる命令を作り、この割り込み機構を利用してスーパバイザ状態で動作するOSへの通信を行い、メモリ領域の獲得やI/O動作などを行わせる。このようなOS機能の呼び出しをシステムコールと呼ぶ。
ユーザ状態のプログラムは、I/O動作などが必要となると、システムコールを出す。システムコールの例外を受信すると、プロセサはスーパバイザ状態に切り替わり、例外原因に対応するアドレスからOS内のプログラムの実行を開始する。システムコールの場合、OSは依頼が正当なものであることをチェックしてから、システムコールで依頼された処理を実行し、結果を依頼元のプログラムに返す。このようなメカニズムを用いることにより、アプリケーションプログラムが重要なプロセサ資源を直接使用し、そのバグによって他のプログラムが影響を受けたり、システム全体がハングしたりしてしまうという事態の発生を防止している。