do_IRQ中的中断向量和irq映射

时间:2013-09-24 01:49:38

标签: linux-kernel interrupt interrupt-handling irq

我正在使用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 我发现通过查找“vector_irq”数组来获取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是我的10GB以太网卡,启用了MSIX。谁能给我一些关于为什么这是映射的想法?以及制作此映射的规则是什么?

感谢。 威廉

2 个答案:

答案 0 :(得分:2)

irq编号(在软件中使用的编号)与矢量编号(中断控制器实际使用的编号)不同。

x86 I / OAPIC中断控制器以16个为一组分配中断优先级,因此向量编号间隔开以防止它们相互干扰 (请参阅arch/x86/kernel/apic/io_apic.c中的函数__assign_irq_vector)。

答案 1 :(得分:2)

  

我想我的问题是如何为特定的分配矢量   IRQ号码和背后的规则是什么。

IOAPIC为每个IRQ输入支持一个名为IOREDTBL的寄存器。软件使用该寄存器的第7-0位为IRQ输入分配所需的向量编号。正是这个向量号用作处理器中断描述符表的索引。引用IOAPIC手册(82093AA)

  

7:0中断向量(INTVEC)-R / W:向量字段是8比特字段   包含该中断的中断向量。矢量值   范围从10h到FEh。

请注意,软件可直接访问这些寄存器 。要访问IOAPIC寄存器(不要与本地APIC寄存器混淆),软件必须使用IOREGSEL和IOWIN寄存器间接与IOAPIC交互。这些寄存器也在IOAPIC手册中描述。

IOAPIC的源信息可能有点难以挖掘。这是我使用的示例的链接: IOAPIC data sheet link