Linux Kernel(2.6)の実装に関するメモ書き

割り込み処理


Rev.3を表示中。最新版はこちら


例外ベクタの設定

i8259の場合、ハードウェア割り込みにはベクタ番号32〜を使用している(31まではプロセッサの予約領域)。

IDTの32番から順番にIRQ0〜15の例外ベクタをset_intr_gate()で設定している。(i8259.c::init_IRQ)

あわせてIRQを例外ベクタ32〜発生させるように割り込みコントローラを設定する。(i8259.c::init_8259A())

例外ベクタ
idt_table[256]
+-------------+
| #0 |
+-------------+
| |
+-------------+
| |
:
+-------------+
| #32 IRQ0 | --> interrupt[0] (* 割り込みのエントリポイント参照)
+-------------+
| #33 IRQ1 | --> interrupt[1]
+-------------+
| #34 IRQ2 | --> interrupt[2]
+-------------+
:

割り込みのエントリポイント



例外ベクタ32〜のエントリがirq_entries_start[IRQ#]
を指すように設定される。


entrt.Sの関連テーブル(コンパイル時に構成される)

entry.S:inerrupt        entry.S::irq_entries_start
+------------+ +-----------------------+
| |--------->| pushl $vector-256 | vector = 0
+------------+ | jmp common_interrupt |
| |----+ | nop |
+------------+ | +-----------------------+
: +---->| | vector = 1
: | |
| |
+-----------------------+
:
:



(ハンドラ呼び出しの流れ)
1. 割り込み発生
(割り込みの例外ベクタは32以降に設定されている)
2. IDTの該当エントリに登録されているアドレスにジャンプ
(irq_entries_start[IRQ#]にジャンプ)
3. 一旦common_interrupt:に飛んでdo_IRQ()へ
4. irq_desc[]に登録されているハンドラへ
(request_irq()で登録される)

最終更新 2006/06/24 16:41:52 - kztomita
(2006/06/24 16:10:57 作成)
添付ファイル
irq_desc.png - kztomita


リンク
最近更新したページ
検索