CPU 如何决定哪个内核应该处理硬件中断?

How does the CPU decide what core should handle a hardware interrupt?

问题Which processor would execute hardware interrupt in a muticore system及其答案似乎从操作系统的角度关注于此,但是CPU如何决定在OS 参与其中?

这是由 I/O-APIC 完成的。 APIC代表高级可编程中断控制器。引自 OSDev WiKi:

In addition, there is an I/O APIC (e.g. intel 82093AA) that is part of the chipset and provides multi-processor interrupt management, incorporating both static and dynamic symmetric interrupt distribution across all processors. In systems with multiple I/O subsystems, each subsystem can have its own set of interrupts.

过时的 link 规范 can be found here。将其部分功能描述为

Provides Multiprocessor Interrupt Management
- Dynamic Interrupt Distribution-Routing Interrupt to the Lowest Priority Processor
- Software Programmable Control of Interrupt Inputs
- Off Loads Interrupt Related Traffic From the Memory Bus

how does the CPU decide what core to deliver a hardware interrupt to before the OS gets involved?

在 OS 介入之前;只有一个 CPU 运行(其余 CPU 卡在 "wait for startup IPI" 状态,直到 OS 启动它们)和中断控制器( PIC 芯片或 IO APIC) 已配置,以便将 IRQ 发送到唯一的 CPU,即 运行。

注:对于BIOS; IO APIC 也被禁用,直到 OS enables/configures 它,固件使用旧的 PIC 芯片(字面上不能用来决定向哪个 CPU 发送 IRQ)。对于 UEFI,固件大多不使用 IRQ(其设备驱动程序轮询设备)。

在 OS 参与之后(不是之前); OS 配置 IO APIC/s,可能还有 MSI(消息信号中断)和 IOMMU 来告诉硬件 CPU 将每个 IRQ 发送到哪个。

有一种特殊情况("send to lowest priority CPU" 功能)芯片组决定将 IRQ 发送到哪个 CPU(基于本地 APIC 或 CR8 中的软件设置 "task priority" ).不幸的是,芯片组可能不支持此功能,即使支持,OS 也可能无法使用。