我在使用Linux3.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是通过查找"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)顺便说一句,这些irqs是我的启用了MSIX的10 my以太网卡。谁能给我一些关于为什么这是映射的想法?进行这种映射的规则是什么?
谢谢。威廉
发布于 2013-09-24 15:02:49
irq数(您在软件中使用的)与向量数(中断控制器实际使用的)不同。
x86 I/OAPIC /OAPIC/OAPIC中断控制器以16个为一组分配中断优先级,因此向量编号之间有间隔,以防止它们相互干扰(参见arch/x86/kernel/apic/io_apic.c中的函数__assign_irq_vector )。
发布于 2013-09-25 04:51:06
我想我的问题是,向量是如何分配给特定的
数字的,以及背后的规则是什么。
对于每个IRQ输入,IOAPIC支持一个名为IOREDTBL的寄存器。软件使用该寄存器的位7-0为IRQ输入分配所需的矢量编号。正是这个向量数字作为处理器中断描述符表的索引。引用IOAPIC手册(82093AA)
7:0中断向量(INTVEC)-读/写:向量域是一个8位字段,包含此中断的中断向量。向量值的范围从10h到FEh。
请注意,软件不能直接访问这些寄存器。要访问IOAPIC寄存器(不要与本地APIC寄存器混淆),软件必须使用IOREGSEL和IOWIN寄存器间接与IOAPIC交互。这些寄存器在IOAPIC手册中也有介绍。
IOAPIC的源信息可能会有一点难以挖掘。下面是我使用的示例的链接:IOAPIC data sheet link
https://stackoverflow.com/questions/18971734
复制相似问题