通常,硬件中断需要立即处理,至少是为了确认它并进行一些第一级处理。据我所知,这不是预定的活动。请纠正我。
所以问题是如何选择一个实际执行这个硬件中断处理程序的处理器?
对于Linux和/或BSD系统,人们可以回答这个问题
答案 0 :(得分: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”实现了相同的功能,但基本概念保持不变。
答案 1 :(得分:1)
这完全取决于操作系统的实现。
有些会将所有中断分配给单个处理器,而其他中断则会在部分或全部处理器之间分配中断处理。
在NUMA系统上,操作系统应尝试将中断处理分配给“附近”的处理器。
您必须阅读您感兴趣的操作系统(和版本)的来源,以确定它的用途。
答案 2 :(得分:1)
通常,这取决于多核处理器和操作系统提供的功能。使用多核处理器时,您可能需要根据需要配置中断的亲和性。
在linux
的情况下,/proc
文件系统具有显示/配置中断关联的条款。
1)各个irq的文件smp_affinity
包含一个位掩码,可用于配置由多核系统中各个核心服务的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
的中断负载平衡守护进程,它可以帮助在处理器内核之间分配中断以优化性能。默认情况下,在某些系统中可以启用此守护程序,因此如果您希望手动配置中断的亲缘关系,则应禁用此守护程序,否则这可能会在每次重置后覆盖已配置的关联。