Linux 3.6.0 を搭載した x86 システムで作業しています。いくつかの実験では、IRQ がベクトルにどのようにマップされているかを知る必要があります。ベクトル0x0から0x20はトラップと例外用であり、ベクトル0x20以降は外部デバイス割り込み用であると多くの本から学びました。そして、これもソースコード Linux/arch/x86/include/asm/irq_vectors.h で定義されています
しかし、私が困惑しているのは、do_IRQ 関数をチェックすると、 http: //lxr.linux.no/linux+v3.6/arch/x86/kernel/irq.c#L181 によって IRQ が取得されていることがわかりました。 「vector_irq」配列を検索します。
unsigned int __irq_entry do_IRQ(struct pt_regs *regs)
{
struct pt_regs *old_regs = set_irq_regs(regs);
/* high bit used in ret_from_ code */
unsigned vector = ~regs->orig_ax;
unsigned irq;
...
irq = __this_cpu_read(vector_irq[vector]); // get the IRQ from the vector_irq
// print out the vector_irq
prink("CPU-ID:%d, vector: 0x%x - irq: %d", smp_processor_id(), vector, irq);
}
printk を使用してコードをインストルメント化することにより、得られた vector-irq マッピングは以下のようになり、これがマッピングである理由がわかりません。マッピングは (irq + 0x20 = vector) である必要がありますが、そうではないようです。
from: Linux/arch/x86/include/asm/irq_vector.h
* Vectors 0 ... 31 : system traps and exceptions - hardcoded events
* Vectors 32 ... 127 : device interrupts = 0x20 – 0x7F
しかし、私の出力は次のとおりです。
CPU-ID=0.Vector=0x56 (irq=58)
CPU-ID=0.Vector=0x66 (irq=59)
CPU-ID=0.Vector=0x76 (irq=60)
CPU-ID=0.Vector=0x86 (irq=61)
CPU-ID=0.Vector=0x96 (irq=62)
CPU-ID=0.Vector=0xa6 (irq=63)
CPU-ID=0.Vector=0xb6 (irq=64)
ところで、これらの irq は、MSIX が有効になっている私の 10GB イーサネット カードです。これがマッピングである理由について、誰かが私にいくつかのアイデアを教えてくれますか? このマッピングを作成するためのルールは何ですか?
ありがとう。ウィリアム