gpt4 book ai didi

linux-kernel - do_IRQ 中的中断向量和 irq 映射

转载 作者:行者123 更新时间:2023-12-02 12:57:30 46 4
gpt4 key购买 nike

我正在使用 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 检测代码,我得到的向量-IRQ 映射如下所示,但我不知道为什么这是这样的映射。我虽然映射应该是(irq + 0x20 = 矢量),但情况似乎并非如此。

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)

顺便说一句,这些中断是我启用了 MSIX 的 10GB 以太网卡。谁能给我一些关于为什么这是映射的想法?进行此映射的规则是什么?

谢谢。威廉

最佳答案

IRQ 号(这是您在软件中使用的)与向量号(这是中断 Controller 实际使用的)不同。

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

关于linux-kernel - do_IRQ 中的中断向量和 irq 映射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18971734/

46 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com