next up previous contents index
Next: KL1レベルでの割り込み処理 Up: 例外処理 Previous: 例外処理

   
割り込み時の処理

 

割り込みが発生した場合、 先に述べたように、KLICでは実行中には一般的には割り込み処理を行わず、 割り込みがあったことのみを記録しておき、後にklic_interruptにて処理を行う。

割り込みがあった「その時」に実行されるコードについての 記述は、runtime/signal.c中で記述されている。

KLICでの割り込み処理は、基本的に以下のように2段がまえになっている。

つまり、割り込みハンドラには2通りがある。以下の説明で、特に 断ることなく「割り込みハンドラ」と称した場合には、後者、つまり、 リダクションの切れ目で行われる処理を記述したハンドラを指す。

この「割り込みハンドラ」の関数仕様は以下のようになっている。

handler(allocp, signal)
q *allocp:
ヒープトップ。つまり、割り込みハンドラ中では、 ヒープ割付を行うことが可能で、したがって、KL1のゴールをわりつけることも できる。

int signal:
割り込み種別(SIGXXX)

SIGINT, SIGALRMについては、以下のように、特殊な割り込みハンドラを システム側で設定している。

これまでの説明で登場しなかった 割り込み処理に関して定義されている主な関数群の説明を以下に記述する。

klic_signal_handler():
割り込みフラグを参照し、 割り込みフラグがonである場合には当該処理を割り込み処理表を参照することにより 実行する。後述されるklic_interupt内で呼びだされる。

add_signal_handler():
割り込み処理を登録する。 つまり、

init_general_signal_handling():
割り込み処理表、 割り込みフラグを初期化する。



Sekita Daigo
1998-05-18