处理器间中断是一种特殊类型的中断,即在多处理器系统中,如果中断处理器需要来自其它处理器的动作,一个处理器向另一个处理器发出的中断行为,以使目标CPU执行特定的操作。
处理器间中断(Inter-Processor Interrupt,IPI)是一种特殊类型的中断,即在多处理器系统中,如果中断处理器需要来自其它处理器的动作,一个处理器向另一个处理器发出的中断行为。可能要求采取的行动包括:刷新其它处理器的内存管理单元缓存,如转译后备缓冲器,当一个处理器更改内存映射时;停机,当系统被一个处理器关闭时。
简介
处理器间中断就是一个 CPU 向系统中的目标 CPU 发送中断信号,以使目标 CPU 执行特定的操作。CPU 将处理器间中断(IPI) 作为信号直接放在 APIC 总线上传输,并不通过 IRQ 中断线。Linux 在内核中使用了三种处理器间中断。CALL_FUNCTION _VECTOR:该中断被发往所有的 CPU,但不包括发送者。该中断促使目标 CPU 执行特定的操作,实际上就是运行一个随参数传递过来的函数。
机制
OS/360 的 M65MP 选件使用 S/360 的直接控制功能生成另一个处理器上的中断;在 S/370 及其后继者,包括 z/Architecture 上,SIGNAL PROCESSOR 指令提供了一个更正式的接口。在使用高级可编程中断控制器(APIC)的 IBM PC 兼容机上,常借助 APIC 发出 IPI 信号。当 CPU 希望向另一个 CPU 发送中断时,它会将中断向量和目标的本地 APIC 标识符存储在自己的本地 APIC 中断命令寄存器(ICR)中。消息随后经由 APIC 总线发送到目标的本地 APIC,它因此发出一个相应的中断至它自己的 CPU。例如在运行 Microsoft Windows 的多处理器系统中,除了上面列出的,处理器还可以出于下列原因中断另一个处理器:排队轮候 DISPATCH_LEVEL 中断,以调度执行特定线程;内核调试器断点。
中断控制器
传统的 X86 处理器使用 8259A 中断控制器。它接收多个外部中断源并发送给系统中单一 CPU 进行处理。如果在多核的 SMP 结构中采用 8259A 中断控制器,那么中断分发的做法就是先将所有外部中断分为若干组,每一组中断被发送到一个 8259A 中断控制器上,然后 8259A 再与某一 CPU 进行连接,也就是 8259A 再将中断发送给这个 CPU。这种不能动态分配中断请求的做法使得硬件的设计变得非常复杂,而且难以扩展。因此,Intel 设计出一种更加通用的中断控制器,称为高级可编程中断控制器 APIC(Advanced Programable Interrupt Contrallor)。首先,在 SMP 结构中,有一个接收所有外部中断、全局的 APIC,被称为 I/O APIC,另一方面,由于 CPU 之间需要进行核间通信,也就是处理器间相互发送中断请求,所以每个 CPU 都有一个本地 APIC。本地 APIC 负责收集本地中断请求和外部发送过来的中断,再将该中断发送给 CPU 处理。
集成在 CPU 芯片内部的本地 APIC 与外部的 I/O APIC 相互配合使用,既可以用于 SMP 结构,也可以用于单 CPU 结构。本地 APIC 中包含一个产生时钟中断的定时器,所以极端情况下还可以选择只使用本地 APIC,而不需要 I/O APIC 的配合,可见这是一个高可配的系统。即使使用了 APIC,每个 CPU 仍然可以单独连接到 8259A 中断控制器上。I/O APIC 由四个部分组成:一组 24 条 IRQ 线、一张 24 项的中断重定向表、可编程寄存器以及发送和接收 APIC 信息的一个信息单元。APIC 的中断优先级并不与引脚号相关联,而是通过中断重定向表的表项单独编程加以指明,该表项还可以指明中断的目标 CPU。中断重定向表用于把每个外部 IRQ 中断请求信号转换为一条消息,然后通过 APIC 总线把消息发送给一个或多个目标 CPU 的本地 APIC 单元。