引数を渡せる割り込み

関東平野は頻度は低いが雪になると相当に降るというので、

今日の帰り道はけっこうな雪の中を歩いて帰ってきた。

今日、特に午後は在宅勤務の人が多かったので、ガラガラだったが。

滑りにくい靴とか、防寒具とか用意した上で、通勤経路を勘案して問題ないということで、出勤してたわけだけどね。


CPUには割り込みを発生させる命令というのがある。

ARMだとSVC命令だし、x86だとINT命令ですか。

で、最近知ったのだが、これらの命令を使ってシステムコールを発生させるとき、

レジスタに値をセットして渡したり、返り値を受け取ったりすることがあると。


一般的な割り込みは割り込み前の汎用レジスタの状態に依存せず動いて、

割り込み前後で汎用レジスタの値は変えないように退避する。

でも、システムコールの場合はそうではない場合があると。

引数をレジスタで受け取って処理を変えることもあるし、

返り値をレジスタに入れて返すということもあると。

SVC命令もINT命令も割り込みの番号を設定することができるけど、

どうせレジスタで引数を渡すなら、命令に付ける番号を使わないという実装もあるよう。


こういうことができるのは、他の割り込みと違って起きるタイミングが決まってるからこそだよね。

割り込みというよりは、関数呼び出しに近い使われ方をしてるんですね。

それでも割り込みという仕組みを使うのは、特権モードになるためである。

ユーザーモードから特権モードに遷移するには割り込みを起こす必要がある。

そのためにソフトウェア的に割り込みを起こす方法を用意していて、

その使われ方というのは関数呼び出しと近い部分があるというわけである。


今まで全て特権モードで動くようなシステムばっかりだったので、

わざわざこういう仕組みを使うことはなかったというのが大きいですけどね。

そうか、ユーザーモードから見れば関数呼び出しみたいなものなのかと。

そんなわけで今さら気づいた話だった。

確かに他の割り込みとは全然違いますよね。