Linuxのカーネルの開発に関する世界観(割り込み)です。
自分の書いたブログ「わたしの名はフレイ」2020/06/26より。
カーネルは、IOデバイスにアクセスする時点で、IOデバイスの処理の終了を待機するが、IOデバイスはプログラムの命令よりも動作が遅いので、いちいちIOデバイス処理を待っていたのでは効率が悪い。
そのため、カーネルはIOデバイス処理を待つ間に、必要とあれば別の処理を行う。
そして、IOデバイスの処理が終わった段階で、カーネルに対して「割り込み」を行う。
割り込まれた時、カーネルはIOデバイスの処理の完了を知り、その後の命令を実行する。
要するに、ハードウェアの要求をカーネルが待っていると遅いので、カーネルが待っている間別の処理をし、ハードウェア側で何かあったら「割り込み」としてカーネルの処理に割り込んでくる、という仕組み。
注意されたい。
割り込みはこれ以外にもある。
マウスやキーボードのイベントを取りこぼすことなく伝えるのも割り込みだし、ハードウェアの割り込みとは別にソフトウェアの割り込みもある。
また、ハードウェアに障害が発生した場合や、効率化や正確なタイミングのために例外を使うこともある。
割り込みとは、つまり「なんらかの作業をしていた時に、別の処理が割り込んでくること」。割り込みは、いつ、どこからやってくるか分からない。
割り込みが発生すると、カーネルは、もともとあったプログラムの現在位置(プログラムカウンタ)を退避させ、割り込みによるアドレスをプログラムカウンタに代入する。
割り込みには同期割り込みと非同期割り込みがあり、これはCPUの実行中にCPUが生成する割り込みか(同期割り込み)、あるいは別ハードウェアによる割り込みか(非同期割り込み)という意味。
同期割り込みのことを例外と呼ぶ。ほとんどの例外は、シグナルをプロセスに送信することで例外に対応処理できる。
後日注記:UNIXのカーネルは常に割り込みの対象であり、プログラムの切り替えや割り込みに対処するために必要であれば同期処理やロックを行う。
詳しくは以下の書籍を参照のこと。
2023.05.12編集
内部割込みは実行中のプログラムの内部からの割り込みのことで、ソフトウェア割込みとも言う。
内部割込み | 説明 |
---|---|
プログラム割込み | 0での割り算やオーバーフローなど、プログラムが原因 |
SVC割込み | OSの入出力システムコールが原因 |
ページフォールト | 仮想記憶においてページが存在しないことが原因 |
外部割込みはハードウェア関連の割込み。ハードウェア割込みとも言う。
外部割込み | 説明 |
---|---|
タイマ割込み | タイマが原因 |
機械チェック割込み | ハードウェア障害や異常が原因 |
入出力割込み | キーボードや入出力機器が原因 |
コンソール割込み | コンソールのスイッチが原因 |
詳しくは以下の書籍・ページが参考になります。
2023.05.07編集
割り込みは、コンピュータシステムの至るところで使われます。
単に、エラーが出た時に割り込むだけではなく、たとえばCPUやメモリの演算命令を行う際に、演算のたびにエラーチェックをしていたのでは効率が悪くなってしまいます。このような際に、不正な値が入らないかどうかを常に監視しておき、不正な値が出た時点で演算処理に割り込むような割り込み処理が行われることがあります。
詳しくは以下の書籍が参考になります。
割り込みの種類については、以下の書籍が参考になります。
以下の書籍が参考になります。
また、以下のページに参考になる内容があります。日本語版もあります。
入出力についてはLinuxカーネル(IO・入出力)、Linuxカーネル(デバイス)、ハードウェア(周辺機器)を参照のこと。
リアルタイムOSについてはリアルタイムOSを参照のこと。