我正在使用Linux 3.6.0在x86系統上工作。對於一些實驗,我需要知道IRQ如何映射到向量。我從很多書中得知,對於矢量0x0至0x20來說是用於陷阱和異常的,而從矢量0x20之後是用於外部設備中斷的。而這也是在源代碼的Linux /弧形限定/ 86 /包括/ ASM/irq_vectors.hdo_IRQ中斷向量和irq映射
不過,我很不解的是,當我檢查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的插裝的代碼中,向量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我的10GB以太網卡啓用MSIX。任何人都可以給我一些關於爲什麼這是映射的想法嗎?以及制定這種映射的規則是什麼?
謝謝。 William
感謝您的解釋。我知道irq號碼和向量號碼不一樣。但我認爲irq和向量數字只是一個偏移量。據我所知,優先級由I/O APIC和本地APIC硬件仲裁,路由條目決定了目標內核。我想我的問題是向量如何分配給特定的IRQ號碼,背後的規則是什麼。 –