3

一般来说,硬件中断需要立即处理,至少以便确认它并进行一些第一级处理。据我了解,这不是预定活动。请纠正我。

所以问题是如何选择一个真正执行这个硬件中断处理程序的处理器?

可以为 Linux 和/或 BSD 系统回答这个问题

4

3 回答 3

2

一般来说,这取决于多核处理器和操作系统提供的功能。在使用多核处理器时,您可能需要根据您的要求配置中断的亲和性。

在 的情况下linux/proc文件系统可以显示/配置中断的亲和性。

1)smp_affinity各个 irq 的文件包含一个位掩码,可用于配置多核系统中由各个核心服务的 irq:

/proc/irq/ 'irq_number'/smp_affinity

echo 2 > /proc/irq/12/smp_affinity  -> Configures the affinity of IRQ 12 to CPU 1
echo 4 > /proc/irq/14/smp_affinity  -> Configures the affinity of IRQ 14 to CPU 2

2) 该文件smp_affinity_list通过避免使用位掩码配置内核的方法,有助于为特定 IRQ 配置 CPU 范围:

/proc/irq/ 'irq_number'/smp_affinity_list

cat /proc/irq/12/smp_affinity_list -> Configures the affinity of IRQ 12 to CPU cores 0 to 3

3) linux还提供了一个中断负载平衡守护进程irqbalance,它可以帮助在处理器内核之间分配中断以优化性能。这个守护进程可能在某些系统中默认启用,因此如果您想要手动配置中断的亲和性,则应该禁用它,否则这可能会在每次重置后覆盖配置的亲和性。

于 2017-01-28T11:35:59.723 回答
2

借助配置IO-APIC(在 IO 控制器集线器上)和本地 APIC(在处理器上)上的寄存器来确定选择用于处理中断的特定处理器。

IO-APIC 和本地 APIC 通过 APIC 总线进行通信,其中将决定哪个处理器将处理广播中断等。在 IO-APIC 上,有一个称为重定向表的东西,可以对其进行编程以指示特定 IRQ 线的目标处理器、中断向量等。

用 Ingo Molnar 的话来说: “大多数(所有)符合 Intel-MP 的 SMP 板都有所谓的 'IO-APIC',它是一种增强的中断控制器。它使我们能够将硬件中断路由到多个 CPU 或 CPU组。没有 IO-APIC,来自硬件的中断将仅传送到引导操作系统的 CPU(通常是 CPU#0)。

来源: https ://www.kernel.org/doc/html/latest/x86/i386/IO-APIC.html

有关各种寄存器的信息(此页面还包含 IO-APIC 规范的链接): https ://wiki.osdev.org/APIC

现代主板利用 MSI(消息信号中断)来传递中断。MSI 不需要 IO-APIC,但仍需要处理器上的本地 APIC。在这里,借助“Root Complex”、“Switch”和“PCI/PIC-X to PCIe Bridge”实现了同样的目的,但基本概念保持不变。

于 2020-12-25T17:17:37.887 回答
1

它确实取决于操作系统的实现。

一些将所有中断分配给单个处理器,而另一些将中断处理分配给一些或所有处理器。

在 NUMA 系统上,操作系统应该尝试将中断处理分配给“附近的”处理器。

您必须阅读您感兴趣的操作系统(和版本)的源代码才能弄清楚它的用途。

于 2016-12-25T19:40:13.110 回答