Linux kernel 在多核系统中,哪个处理器将执行硬件中断

Linux kernel 在多核系统中,哪个处理器将执行硬件中断,linux-kernel,linux-device-driver,embedded-linux,device-driver,netbsd,Linux Kernel,Linux Device Driver,Embedded Linux,Device Driver,Netbsd,一般来说,需要立即处理硬件中断,至少是为了确认它并进行一些第一级处理。据我所知,这不是预定的活动。请纠正我 所以问题是如何选择一个真正执行这个硬件中断处理程序的处理器 对于Linux和/或BSD系统,可以回答这个问题,这确实取决于操作系统的实现 一些将所有中断分配给单个处理器,而另一些将中断处理分配给部分或所有处理器 在NUMA系统上,操作系统应尝试将中断处理分配给“附近”的处理器 您必须阅读感兴趣的操作系统的源代码(和版本),才能了解它的用途。一般来说,这取决于多核处理器和操作系统提供的功能。

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

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


对于Linux和/或BSD系统,可以回答这个问题,这确实取决于操作系统的实现

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

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


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

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

linux
的情况下,
/proc
文件系统具有显示/配置中断相关性的功能

1) 各个irq的文件
smp\u affinity
包含一个位掩码,可用于配置irq,以便在多核系统中由各个核提供服务:

/proc/irq/
“irq\u编号”
/smp\u

2) 文件
smp\u affinity\u list
通过避免使用位掩码方法来配置内核,有助于为特定IRQ配置一系列CPU:

/proc/irq/
'irq\u编号'
/smp\u亲缘关系\u列表


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

选择特定处理器来处理中断是通过在上配置寄存器来确定的IO-APIC(在IO控制器集线器上)和本地APIC(在处理器上)

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

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

资料来源:

有关各种寄存器的信息(本页还包含IO-APIC规范的链接):


现代主板利用MSI(消息信号中断)来传递中断。MSI不需要IO-APIC,但仍然需要处理器上的本地APIC。在这里,通过“根复合体”、“交换机”和“PCI/PIC-X到PCIe网桥”实现了相同的功能,但基本概念保持不变。

感谢您的回答+1。我想确定你的答案是关于硬件中断,而不是下半部分处理,这实际上是一个计划的活动。我没有区分中断处理程序的“下半部分”和硬件中断。但是一些硬件系统可能会将硬件中断连接到处理器的子集,甚至是单个处理器,这使得操作系统更加有趣。(请记住,在IBM-PC/AT系统体系结构中,X86对世界的意义远不止这些。)它部分取决于操作系统的实现,更重要的是取决于PICs、PIR等的硬件实现。@EricSchnoebelen-它的哪一部分应该取决于操作系统的实现?除了硬接线数字电路,我想不出别的东西。因为在硬件中断中,从设备到中断控制器再到处理器,只有数字脉冲发挥作用。只有在脉冲到达处理器OS后,操作系统才能开始其工作。AFAIK主线Linux只支持SMP,即对称多处理器硬件,这意味着任何处理器都可以为中断服务。我见过UNIX移植到非对称硬件,即有一个专用于I/O和中断的处理器。顺便说一句,处理器不“执行中断”。它可以为中断提供服务,即执行中断服务例程,也支持ISR、Wait和UP。
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
cat /proc/irq/12/smp_affinity_list -> Configures the affinity of IRQ 12 to CPU cores 0 to 3