查看 x86 Linux 上的内容/proc/interrupts
,我发现一些中断是 ,IO-APIC-edge
而另一些是IO-APIC-level
.
我想知道是什么决定了中断类型,是中断产生设备、中断控制器(APIC)、Linux内核还是BIOS?
(我想知道的原因是因为我将 PCI 卡从双处理器 Pentium III 系统(它被识别为IO-APIC-level
双处理器 Xeon 系统)移至双处理器 Xeon 系统(它被识别为IO-APIC-edge
)
答案1
例如82093AA IO-APIC具有 I/O 重定向表寄存器 (IOREDTBL),其中有一个可写位指定触发方式(可以是水平或边缘敏感)。这些寄存器似乎反映struct IO_APIC_route_entry
在内核源代码中。
深入研究 2.6.18 内核源代码,我们会发现一个函数setup_IO_APIC_irqs(..)
,该函数循环遍历找到的所有 IO-APIC 以及每个 IO-APIC 的所有 IRQ 线,并调用io_apic_write(..)
写入 APIC 的寄存器。
触发器类型似乎是由函数MPBIOS_trigger(..)
(由 调用irq_trigger(..)
)决定的,该函数又似乎参考了一个变量,mp_irqs
而该变量又似乎被填充arch/x86_64/kernel/mpparse.c
。这个文件似乎读取了符合的MP配置表英特尔多处理器规范。
从此规范中引用:
The BIOS constructs the MP configuration data structures, presenting the
hardware in a known format to the standard device drivers or to the
hardware abstraction layer of the operating system.
所以我想说内核根据BIOS提供的信息配置中断触发类型。
旁注:维基百科关于中断的文章提到
The original PCI standard mandated shareable level-triggered interrupts.
(这似乎来自于同一线路上多个设备同时发送的边沿触发中断会发生冲突)。对于 PCI 设备来说这IO-APIC-edge
有点出乎意料。
答案2
决定这一点的是变量lpfc_use_msi
。如果您将其设置为 2,那么modprobe.conf
它将使用 MSI 而不是 IO。建议使用“MSI中断模式”。