IA-32上自我IPI的目的

时间:2012-11-16 12:06:32

标签: x86 interrupt ia-32

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

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

  

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

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

4 个答案:

答案 0 :(得分:3)

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

另一种情况可能是多核系统,您将工作或消息传递给“免费”核心来处理负载。 “免费”核心可能是当前的核心,再次你不希望在软件中有一个特殊情况,因为你正在向自己发送一个中断。

答案 1 :(得分:2)

自我IPI还有另一个原因。

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

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

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

BSP可以自己发送SMI IPI,然后发送一个AP。然后他们将一个接一个地重新安置到非冲突地区。

我确信还有许多其他需要自我IPI的情况。只要CPU在初始SMI状态下共享一个关键区域,就会激发自我IPI的一致性。

答案 2 :(得分:2)

我猜你已经知道了2年过去的原因。

但这是我的理解:

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

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

答案 3 :(得分:1)

不,不,不,不。

Chris Desjardins 最接近真正的原因。

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

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

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