Linuxカーネルに関する技術情報を集めていくプロジェクトです。現在、Linuxカーネル2.6解読室の第2章までを公開中。
Linuxカーネルは割り込みを受けると、そのとき動作していた処理を中断し、割り込みハンドラを起動します。
割り込みには、応答性の確保が必要です。伝統UNIXでは、応答性を確保するために割り込みレベルという考え方を採用していました。高い応答性を必要とする割り込みには、高い優先度を与えるという考え方です。低い優先度の割り込みハンドラ実行中に高い優先度の割り込みが発生すると、低い優先度の割り込みハンドラを中断し、高い優先度の割り込みハンドラを実行します。その逆の場合は、高い優先度の割り込みハンドラの実行が終わるまで、低い優先度の割り込み要求を保留状態にしておきます。
Linuxカーネルでは別の方法を採用しています。各割り込み処理自体を応答性を必要とする部分と、必要としない部分に分ける方式です。応答性を必要とする部分は、なるべく実行時間が短くなるように設計し、ハードウェア割り込みハンドラで実行します。応答性を必要としない部分は、まとめて後から実行します。この処理はソフト割り込み(またはソフトIRQ)*1と呼ばれるものです(詳しくは「第3章 遅延処理」を参照)。システムがソフト割り込みハンドラを実行中には、そのソフト割り込みの要因となった、ハードウェア割り込みを受け付けることが可能です(表2-1)。
ハードウェア割り込み | ソフト割り込み |
イーサネットドライバ処理 | TCP/IPプロトコル処理 |
SCSIホストバスアダプタドライバ処理 | SCSIプロトコル処理 |
シリアルドライバ処理 | 端末制御処理 |
Linuxカーネルの割り込み処理は、マルチプロセッサ環境でも効率良く動作するように設計されています。
Linuxカーネルは、割り込みスタックを用意していないという実装上の特徴もあります。Linuxカーネルでは、割り込みが発生したとき、その時点で実行中のカレントプロセスのカーネルスタックを利用して動作します。ソフト割り込みも同じスタックを利用して動作します*2。 これらの処理はネストするため、カーネルスタックの消費量は大きくなります。Linuxカーネルは、各プロセスに大きめのカーネルスタックを持たせることで対応しています。