簡體   English   中英

do_IRQ中的中斷向量和irq映射

[英]Interrupt vector and irq mapping in do_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我發現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是我的10GB以太網卡,啟用了MSIX。 誰能給我一些關於為什么這是映射的想法? 制作這種映射的規則是什么?

謝謝。 威廉

irq編號(在軟件中使用的編號)與矢量編號(中斷控制器實際使用的編號)不同。

在x86 I / OAPIC中斷控制器分配在16的基團中斷優先級,所以矢量號隔開,以防止它們相互干擾(見函數__assign_irq_vector拱/ 86 /內核/ APIC / io_apic.c )。

我想我的問題是如何為特定的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數據表鏈接

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM