2013-09-24 28 views
4

我正在使用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

回答

2

irq號碼(這是你在軟件中使用的)不同於向量號(這是中斷控制器實際使用的)。

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

+0

感謝您的解釋。我知道irq號碼和向量號碼不一樣。但我認爲irq和向量數字只是一個偏移量。據我所知,優先級由I/O APIC和本地APIC硬件仲裁,路由條目決定了目標內核。我想我的問題是向量如何分配給特定的IRQ號碼,背後的規則是什麼。 –

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

+1

感謝您的回覆。我發現現在大多數設備都使用MSI-X而不是傳統的IRQ中斷,其中IRQ不與IOAPIC硬件中的PIN綁定。我經常得到60以上的IRQ,我猜這不是真正的硬件引腳。在這種情況下,IOAPIC及其重定向表是否仍然適用於重定向基於MSI的中斷?或者MSIX直接進入CPU內核? –

+1

對,MSI-X允許PCI-E設備在每個IRQ輸入沒有實際物理連線的情況下斷言特定的IRQ。但是IRQ號碼與矢量號碼的映射如上所述。 – srking