[英]What is the meaning of the instruction {interrupt do_IRQ} in linux kernel?
[英]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.