一般来说,硬件中断需要立即处理,至少以便确认它并进行一些第一级处理。据我了解,这不是预定活动。请纠正我。
所以问题是如何选择一个真正执行这个硬件中断处理程序的处理器?
可以为 Linux 和/或 BSD 系统回答这个问题
一般来说,硬件中断需要立即处理,至少以便确认它并进行一些第一级处理。据我了解,这不是预定活动。请纠正我。
所以问题是如何选择一个真正执行这个硬件中断处理程序的处理器?
可以为 Linux 和/或 BSD 系统回答这个问题
一般来说,这取决于多核处理器和操作系统提供的功能。在使用多核处理器时,您可能需要根据您的要求配置中断的亲和性。
在 的情况下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
,它可以帮助在处理器内核之间分配中断以优化性能。这个守护进程可能在某些系统中默认启用,因此如果您想要手动配置中断的亲和性,则应该禁用它,否则这可能会在每次重置后覆盖配置的亲和性。
借助配置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”实现了同样的目的,但基本概念保持不变。
它确实取决于操作系统的实现。
一些将所有中断分配给单个处理器,而另一些将中断处理分配给一些或所有处理器。
在 NUMA 系统上,操作系统应该尝试将中断处理分配给“附近的”处理器。
您必须阅读您感兴趣的操作系统(和版本)的源代码才能弄清楚它的用途。