最終更新:2016-09-16 (金) 15:18:26 (2772d)
Linux/割り込み
ドキュメント
Linuxカーネルが割り込みとして扱うもの
外部装置割り込み
- SCSIホストアダプタ、ネットワークカード、端末装置などが生成する割り込み。その割り込みに対応するデバイスドライバの割り込みハンドラを起動する
タイマー割り込み
- タイマーコントローラが一定周期で割り込みを発生させる。Linuxでは2種類のタイマー割り込み(グローバルタイマー割り込み、ローカルタイマー割り込み)を利用している。
プロセッサ割り込み?
- マルチプロセッサ環境において、ほかのCPUへ何らかの事象を通知するために利用される。割り込み要求を受けたCPUは、その事象に対応する処理を実行する
NMI
- 通常の割り込みは、マスクすることによって、CPUが割り込みを受け取ることを抑制できるが、NMIはマスクできない。通常は、緊急時の障害対応目的で利用される
procfs
- Linux/proc/interrupts - I/O デバイスあたりの CPU あたりの割り込み数を一覧表示
- Linux/proc/irq?
コンテキスト
- ハードウェア・イベントによる割り込みが発生すると、割り込みコンテキストで処理が開始される
- 時間のかかる処理はプロセスコンテキストに引き渡す。
コンテキスト スリープ プリエンプティブ 処理時間 割り込みコンテキスト 不可 不可 極力短く プロセスコンテキスト (ユーザコンテキスト?・スレッドコンテキスト?) 可 可 長くても構わない
割り込みハンドラ
ハンドラの登録
- request_irq - 指定したIRQに対する割り込みハンドラを登録する
ハンドラ自体
- irqreturn_t irq_handler_t(int irq, void *dev)
- irq: 割り込み番号。
- dev: request_irq() で指定したデバイス。
- 結果:
分類
トップハーフ?
- 割り込みコンテキストで行われる処理
- 割り込み後、即座に実行する。時間制約のあるものだけ を実行する。例:ハードウェアに対する通知。
- request_irq
ボトムハーフ
- 割り込みの発生による処理のうち、割り込みコンテキストからカーネルのコンテキスト(プロセスコンテキスト)に渡されて行われる処理
- 割り込みの後、都合のよい時期にやる。 その後の割り込みを許可した状態で行う。
softirq
- Linux 2.3?以降、32の静的に定義されたボトムハーフ一式を実装する。現在は9つ。
- 動的な新しいメカニズムとは異なり、コンパイル時に静的要素として定義される
- かつて、カーネルスレッドのコンテキストで最も優先される処理 (ソフトウェア割り込み) に使用されていた
タスクレット
- softirqがベース
- 割り込みコンテキスト
ワークキュー (Linux 2.5?〜)
- タスクレットの問題を改善するもので、専用のカーネルスレッドを作って実行する
- 次のような場合に使う
- sleepする必要がある。
- 割り込みコンテキストではなく、プロセスコンテキストで関数を呼び出したい
- メモリを確保したい(ページアウトのためにsleepする可能性がある)
- セマフォ等の同期処理を行う