6

在 IA-32 架构上,处理器向自身发送处理器间中断的目的是什么?

根据英特尔 IA-32 架构软件开发人员手册,卷。3,第。10.1:

IPI 用于软件自中断、中断转发或抢占式调度。

但是,当处理器也可以使用 INT 指令中断自身时,为什么还要使用自 IPI?这个功能似乎是多余的。

4

4 回答 4

3

我认为最大的原因是一致性:如果您正在为多核处理器编写软件,并且您想向系统中的所有内核发送中断,那么必须对每个其他内核执行 IPI,然后执行INT 中断当前内核,当然您还必须为两个中断源等设置处理程序......将 IPI 发送给每个人要容易得多。

另一种情况可能是多核系统,您将工作或消息传递给“空闲”核心以处理负载。“免费”核心可能是当前核心,同样您不希望仅仅因为您正在向自己发送中断而在软件中出现特殊情况。

于 2012-11-16T13:20:24.213 回答
3

我想你已经知道原因了,因为 2 年过去了。

但这是我的理解:

IPI 可以在 IRQ 被禁用时被阻止,它由 IOAPIC 保存,直到目标内核使用 sti 指令重新启用 IRQ。然而,无论是否启用 IRQ,int 指令总是将 CPU 捕获到较低的环级别。

所以当内核想要做某事时可能需要自我 IPI,但现在当 IRQ 被禁用时不需要。因此,它会向自己发送一个 IPI,一旦重新启用该内核上的 IRQ,就会发生此类中断。

于 2014-10-14T17:28:09.800 回答
2

自我 IPI 还有另一个原因。

如果您初始化一个 SMI 处理程序,它首先位于 ram 中的低地址。整个 CPU 状态保存在 SMI 中。但是,所有 CPU 最初都将使用相同的状态区域,并且新的重定位地址是通过操作状态变量来设置的。

在这种情况下,您希望同时将初始 SMI 发送到一个 CPU。如果您将其发送给所有人,他们都将使用相同的区域来存储状态,这将是一场灾难。

为所有 CPU 使用相同的 SMI 处理程序重定位初始化例程很方便,因此您可以使用带有 SMI 类型的自 IPI 来输入 SMI 重定位代码。

BSP 可以将 SMI IPI 发送给它自己,然后同时发送给一个 AP。然后他们将一一迁移到非冲突地区。

我确信还有许多其他需要自我 IPI 的情况。每当 CPU 共享一个关键区域(如在初始 SMI 状态中)时,就会激发自身 IPI 的一致性。

于 2013-03-14T09:25:02.600 回答
1

不,不,不,和不。

Chris Desjardins 最接近真正的原因。

我将尝试阐明自我 IPI 的目的。自 IPI 与软件中断无法区分 ( INT nn)。两者都会通过中断描述符表 (IDT) 调用指定的中断处理程序。此外,内核可以使用两者来调用一些处理过程。但是,虽然操作系统内核倾向于广泛使用 Self-IPI,但它们从不使用软件中断。为什么和什么会有所不同?首先,这两种方法都很昂贵。中断处理对 CPU 来说是一项繁重的工作,需要耗费数百个周期。当调用者和被调用者都驻留在内核中时,中断处理程序序言和结语执行大量簿记是不必要的。常规函数调用只需要几个 CPU 周期,并产生与软件中断相同的效果。所以没有任何理由多付一百倍并使用INT nn. 因此,内核从不INT nn在其代码中使用软件中断 ( )。然而,他们仍然广泛使用 Self-IPI,这似乎做同样的工作。有什么区别?它们之间潜在且不明显的对比是,软件中断作为任何其他指令直接在 CPU 内核中处理,但 Self-IPI 像任何其他硬件中断一样通过本地 APIC。虽然INT nn只模拟硬件中断,但 Self-IPI 与 IO 设备生成的 IRQ 请求无法区分。

在这里我们可以找到要点:Local APIC 实现了中断优先级模式。它总是传递给 CPU 中断请求,该请求具有所有待处理的最大向量值。具有较高优先级的中断请求可以抢占较低优先级中断的中断处理程序的执行。换句话说,内核现在可以有多个堆栈中断处理程序。此外,它有一个 TPR 寄存器,用于清除优先级低于或等于指定的中断报告。操作系统如此广泛地使用它,以至于在 x64 中,它被 CR8 寄存器作为别名以便更快地访问。通常,操作系统严重依赖本地 APIC 优先级模式。例如,Windows 中的 IRQ 级别直接映射到本地 APIC 优先级类。内核小心地在中断源之间分配向量,以将它们分配给不同的优先级并以良好的顺序进行。例如,系统定时器通常具有最高优先级,不能被任何其他中断处理程序阻塞或抢占。当内核进行 Self-IPI 时,它请求调用指定的中断处理程序并计算其优先级。

说明性的例子。Windows 直接基于本地 APIC 优先级架构实现延迟过程调用机制。DPC 中断处理程序具有最低优先级。使用 DPC,Windows 实现了类似于 Linux 中的中断处理策略,称为上半部/下半部。上半部分处理程序以高优先级运行,并且应该尽可能短且尽可能快。它将所有与中断处理相关的繁重工作委托并推迟到以低优先级运行的下半部分处理程序。同样,在 Windows 中,硬件中断处理程序以高优先级运行,并使用 Self-IPI 为任何繁重的工作安排 DPC。DPC 作为一个中断,以高于常规代码(线程、进程、应用程序)的优先级运行,但由于它的优先级最低,它在所有挂起的硬件中断处理程序完成时运行。此外,虽然 DPC 执行会阻塞常规代码,但它不会阻塞、延迟或推迟硬件中断处理程序的执行。即使对于在 DPC 过程中间到达的中断也是如此。

于 2021-03-26T02:41:40.750 回答