割り込みについて調べてみました

割り込みについて調べてみたのでメモしておきます。
ほとんどは 詳解 Linuxカーネル 第3版 で調べた内容なので、x86Linux よりの内容になっていると思います。

「割り込み」ってなんだろ?(2012/03/04追記)

  • 「割り込み」は何らかの要因によって今やっている仕事をやめ、急遽別の仕事をすること。
  • 仕事中に電話がかかってきて、仕事を中断して電話に出るのは割り込みの概念と同じ。
  • コンピュータにおいても人間がキーボードをいつ押すかコンピュータにはわからないが、コンピュータがずっとキーボードを監視していたのではほかの処理ができない。何か処理を実行中でもキーボードが押されると割り込んで、キーボードから入力されたデータを受け取って必要な処理を行ってから元の処理を再開する。
  • このように何かイベントが起こったときにCPUにそのことを知らせ、そのイベントにあった処理をして、その処理が終わると、今までやっていた仕事を続ける。これを「割り込み」という。

割り込みとは

  • 「プロセッサが実行する命令列を変更する事象」のこと。
  • CPU内部またはCPU外部のハードウェア回路が生成する電気的な信号により発生する。
  • CPUは現在行っている処理を中断し、別の処理を行う。プログラムカウンタの現在の値をカーネルモードスタックに退避し、割り込みの種類に対応したアドレスをプログラムカウンタに代入する。
  • 割り込みハンドラや例外ハンドラが実行するコードはプロセスではない。
  • 割り込み発生時に実行中だったプロセスを犠牲にして処理を行うカーネル実行パスの1つ。
  • カーネル実行パスのため、割り込みハンドラはプロセスより軽い処理になる(割り込みのコンテキストは小さく、コンテキストの用意と破棄に必要となる時間も短くと済む)。
  • 割り込みを利用することによって、実際にハードウェアが利用可能な状態になるまでCPUは別の作業に専念できる。

割り込みの種類

  • ハードウェア割り込み(非同期割り込み/割り込み)
    • マスク可能割り込み
    • マスク不可割り込み
  • ソフトウェア割り込み(同期割り込み/例外)
    • プロセッサが検出する例外
      • フォルト
      • トラップ
      • アボート
    • ソフトウェアが生成する例外(ソフトウェア例外)

割り込みの説明

ハードウェア割り込み(非同期割り込み/割り込み)
  • CPUのクロック信号に合わせて、CPU以外のハードウェアデバイスが任意の時点で生成する割り込み。
  • インターバルタイマとI/Oデバイスが生成する。
  • たとえば、ユーザがキーボードを叩くと発生する。
ソフトウェア割り込み(同期割り込み/例外)
  • CPUが命令を実行中にCPUの制御回路が生成する割り込み。
  • 各命令の実行終了時にのみ制御回路が割り込みを発生させるため同期的と呼ばれる。
  • プログラミングエラーやカーネルが処理しなければならない異常や特殊な状態の場合に発生する。
  • プログラミングエラーの場合、カーネルは例外処理として、シグナルをカレントプロセスに配信する。
  • ページフォルト例外のような特殊な状態から復帰するための手続きを実行したり、カーネルサービス(intやsysenter)の要求に応えたりする。
マスク可能割り込み
  • I/Oデバイスが生成する全てのIRQはマスク可能割り込みを発生する。
  • マスク可能割り込みはマスク状態とマスク解除状態のどちらかの状態を取る。
  • 制御回路はマスク状態の割り込みをマスクが解除されるまで無視する。
マスク不可割り込み
  • ごく少数のクリティカルな事象(ハードウェアの故障など)だけがマスク不可割り込みを発生する。
  • マスク不可割り込みはどんなときでもCPUに通知される。
プロセッサが検出する例外
  • CPUが命令を実行中に異常や特殊な状態を検出すると発生する。
  • 例外発生時のeipレジスタの値によって、3つのグループに分類できる。
  • eipレジスタは例外発生時にCPUの制御回とがカーネルモードスタックに退避する。
フォルト
  • 一般的には修復が可能な例外。
  • 一度修復すると、プログラムは連続性を失うことなく処理を再開できる。
  • たとえば、プロセスアドレス空間内でも、単にまだ割り当てられていないページを参照すると例外が発生する。
トラップ
  • トラップ命令を実行すると直ちに発生する例外。
  • カーネルがこの処理を終えて元のプログラムへ戻ると、プログラムは連続性を失うことなく処理を再開できる。
  • トラップの主な用途はプログラムのデバッグ。この場合の割り込み信号の役割は、特定の命令が実行されたこと(プログラム内のブレークポイントに到達したこと)をデバッガに知らせること。ユーザがデバッガで値を調べ終えたら、被デバッグプログラムを次の命令から再実行させる。
アボート
  • 致命的エラーが発生した場合の例外。
  • このハンドラでは該当プロセスを終了させる以外は何もできない。
ソフトウェアが生成する例外(ソフトウェア例外)