割り込みについて調べてみたのでメモしておきます。
ほとんどは 詳解 Linuxカーネル 第3版 で調べた内容なので、x86 と Linux よりの内容になっていると思います。
「割り込み」ってなんだろ?(2012/03/04追記)
- 「割り込み」は何らかの要因によって今やっている仕事をやめ、急遽別の仕事をすること。
- 仕事中に電話がかかってきて、仕事を中断して電話に出るのは割り込みの概念と同じ。
- コンピュータにおいても人間がキーボードをいつ押すかコンピュータにはわからないが、コンピュータがずっとキーボードを監視していたのではほかの処理ができない。何か処理を実行中でもキーボードが押されると割り込んで、キーボードから入力されたデータを受け取って必要な処理を行ってから元の処理を再開する。
- このように何かイベントが起こったときにCPUにそのことを知らせ、そのイベントにあった処理をして、その処理が終わると、今までやっていた仕事を続ける。これを「割り込み」という。
割り込みとは
- 「プロセッサが実行する命令列を変更する事象」のこと。
- CPU内部またはCPU外部のハードウェア回路が生成する電気的な信号により発生する。
- CPUは現在行っている処理を中断し、別の処理を行う。プログラムカウンタの現在の値をカーネルモードスタックに退避し、割り込みの種類に対応したアドレスをプログラムカウンタに代入する。
- 割り込みハンドラや例外ハンドラが実行するコードはプロセスではない。
- 割り込み発生時に実行中だったプロセスを犠牲にして処理を行うカーネル実行パスの1つ。
- カーネル実行パスのため、割り込みハンドラはプロセスより軽い処理になる(割り込みのコンテキストは小さく、コンテキストの用意と破棄に必要となる時間も短くと済む)。
- 割り込みを利用することによって、実際にハードウェアが利用可能な状態になるまでCPUは別の作業に専念できる。
割り込みの種類
- ハードウェア割り込み(非同期割り込み/割り込み)
- マスク可能割り込み
- マスク不可割り込み
- ソフトウェア割り込み(同期割り込み/例外)
- プロセッサが検出する例外
- フォルト
- トラップ
- アボート
- ソフトウェアが生成する例外(ソフトウェア例外)
- プロセッサが検出する例外
割り込みの説明
ハードウェア割り込み(非同期割り込み/割り込み)
ソフトウェア割り込み(同期割り込み/例外)
マスク可能割り込み
マスク不可割り込み
- ごく少数のクリティカルな事象(ハードウェアの故障など)だけがマスク不可割り込みを発生する。
- マスク不可割り込みはどんなときでもCPUに通知される。
プロセッサが検出する例外
フォルト
- 一般的には修復が可能な例外。
- 一度修復すると、プログラムは連続性を失うことなく処理を再開できる。
- たとえば、プロセスアドレス空間内でも、単にまだ割り当てられていないページを参照すると例外が発生する。
トラップ
アボート
- 致命的エラーが発生した場合の例外。
- このハンドラでは該当プロセスを終了させる以外は何もできない。
参考
- 詳解 Linuxカーネル 第3版 P.141-200
- Linuxカーネル2.6解読室 P.60-70
- プロセッサを支える技術 ??果てしなくスピードを追求する世界 (WEB+DB PRESS plus) P.173-179
- プログラムはなぜ動くのか ― 知っておきたいプログラミングの基礎知識 P.253-257
- 仮想化の基本と技術 (仕組みが見えるゼロからわかる) P.109
- 目指せプログラマー!