【问题标题】:disabling interrupts on hyperthreaded processor在超线程处理器上禁用中断
【发布时间】:2026-01-28 03:20:08
【问题描述】:

假设我有一个超线程处理器,操作系统将它们视为两个不同的虚拟处理器 vp1 和 vp2。现在在 vp1 上的 LWP1 中,我禁用了硬件中断中断。这不是说除非启用,否则两个虚拟处理器都不会得到任何中断吗?如果这是真的,那也应该意味着另一个处理器 vp2 上的另一个 LWP2 启用中断也会启用 vp1 上的中断?我假设禁用内核中断,只会在本地处理器上禁用它。

请解释这是如何工作的。

【问题讨论】:

  • 处理器(内核)只有一个(在某些架构上是两个)引脚用于中断信号。 (好吧,NMI 是一个单独的案例)。你说的是例外吗?或者确定是什么意思?
  • 什么是 LWP?无论如何,可以在eflags 级别、LAPIC 级别、中断控制器级别(IOAPIC 或 PIC)和设备级别禁用中断。前两个是为每个核心复制的资源,因此这些级别是每个核心的。中断控制器可以为整个集合或逻辑处理器的子集提供服务,因此禁用那里的中断可能会影响多个内核(通常所有内核都用于桌面/移动配置)。在设备级别,任何代理都禁用中断,因为这会完全“删除”源。解释 x86 中断子系统过于宽泛,无法回答。
  • 编辑了我的问题 - 为了更好地理解,但我不是指例外,我指的是来自以太网卡等硬件设备的中断。LWP 是轻量级进程,是操作系统上的一个计划实体,位于内核内部。
  • 修正:在我之前的评论中,我所说的“核心”是指“线程”(即逻辑处理器)。
  • @0andriy:好的,作为没有 HT 的心智模型,这很有意义。但是英特尔的超线程技术为物理核心上的每个逻辑核心提供了自己的逻辑“线路”。我猜在物理上/电气上可能有两根实际的电线,每根都由一个逻辑核心的IF 门控。 clisti 正在序列化,IIRC,因此 CPU 在乱序执行期间不需要跟踪 IF 状态。但更有可能的是,中断号直接发送到逻辑核心,而不是引发中断,然后让它从某个地方请求中断号,以便它可以索引 IDT。

标签: linux-kernel x86 interrupt hyperthreading isr


【解决方案1】:

超线程处理器的两个逻辑内核具有自己的 APIC ID,因此就中断而言,它们是独立的 CPU。 (在 Knight's Landing / Xeon Phi 中,四个逻辑核心)

这使得可以在内核模式下使用cli / sti 独立于其他任何逻辑内核禁用中断。一切都与非 SMT 多核系统完全相同,因为超线程就是这样设计的。

其他任何事情都会带来不便和奇怪,并且有时会通过禁用它正在等待的中断来增加其他逻辑核心的延迟,因此很明显这是英特尔设计它的明智方式。

【讨论】: