处理器间中断

科技工作者之家  |   2020-11-17 17:53

处理器间中断(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单元1。

分发方式系统分发 IRQ 中断给 CPU 主要有两种方式:静态分发和动态分发。

静态分发:所有本地 APIC 都会被静态写入中断重定向表的表项中,IRQ 中断请求信号会发送给这些表项的列出的本地 APIC。然后本地 APIC 再将中断发送给目标 CPU。

动态分发:在所有 CPU 正在执行的进程中,如果某个 CPU 正在执行的进程的优先级最低,IRQ 中断请求信号就传递给这个 CPU,这就是所谓的最低优先级模式。每个本地 APIC 内部都包含一个可编程任务优先级寄存器 TPR,该寄存器计算运行进程的优先级,以供中断分发参考使用。操作系统内核在进程切换时都会对这个寄存器进行修改。如果多个 CPU 有相同的最低优先级,这种情况是可能的,此时系统就利用仲裁技术来分配 CPU 的负荷。在本地APIC 中有一个仲裁优先级寄存器中,初始化时会为每个 CPU 都分配一个 0—l5 范围内的值。当某 CPU接收到一个中断时,其仲裁优先级的值就自动设置为 0,而其他 CPU 的仲裁优先级都增加一。当仲裁优先级寄存器的值大于15 时,就将获取中断的那个 CPU 的前一个仲裁优先级加 l,作为当前 CPU 的仲裁优先级。因此,中断在 CPU 之间以轮转方式进行分发,并且各个 CPU 任务优先级相同。多 APIC 系统还处理 CPU 之间产生的处理器间中断。某 CPU 为了要向目标CPU 发送中断,它先要将中断向量和目标 CPU 的本地 APIC 的 ID 存入中断指令寄存器 ICR 中,然后经过 APIC 总线向目标 CPU 发送核间中断,目标CPU 接收中断,然后进行中断处理。处理器间中断(IPI)是 SMP 体系结构非常重要的组成部分,利用它可以进行 CPU 间的通信,有效地提升系统的效率。

本词条内容贡献者为:

李嘉骞 - 博士 - 同济大学