IPI 介绍
IPI, inter-processor interrupt, 处理器间中断。其本质也是一种中断,处理器可通过 IPI 机制向系统总线上的另一个或一组处理器发送中断请求,用于软件自中断、中断转发或抢占式调度 (software self-interrupts, interrupt forwarding, or preemptive scheduling) 。
参与产生 IPI 的主要寄存器是 local APIC 中的中断控制寄存器 (ICR, interrupt command register)。
ICR 常用于以下方面:
- 处理器发送中断给另一个处理器;
- 处理器将接收到的中断转发给其他处理器处理;
- 产生一个中断给自己;
- 产生特殊的 IPI 给其他处理器。 比如计算机启动过程中第一个启动的处理器 (BSP) 发送 start-up IPI (SIPI) 唤醒其他处理器。
根据英特尔的SDM,ICR 的结构如下图所示:
ICR 一共64位,除了发送状态字段 (Delivery Status) 为只读, 其余各位均可读写。软件通过修改各个位上的值,实现向系统中其他处理器发送中断的目的。
在 ICR 的各个字段中,
Vector 表示中断号,接收 IPI 的处理器根据中断号,从中断描述符表 IDT 中找到对应的中断处理程序并执行。
Delivery Mode 指定发送的 IPI 类型。
Destination Mode 指定接收中断的形式是物理模式还是逻辑模式。
Delivery Status 表示 IPI 的状态,表示 local APIC 已经完成发送 (Idle) , 或未完成发送 (Send Pending)。
Level 表示发送中断的电平设置。
Trigger Mode 表示中断为边沿触发还是电平触发。
Destination Shorthand 表示发送的中断目的地类型:No Shorthand,由 Destination Field 指定;Self,发送给自己;All Including Self,包括自己在内的所有处理器;All Excluding Self,除自己在内的其他所有处理器。
Destination Field 表示发送的中断目的地。若 Destination Mode 为 physical,则此处表示目标处理器物理地址,即 APIC ID;若 Destination Mode 为 logical,则此处表示目标处理器使用 DFR 和 LDR 设置的逻辑地址。
每当 ICR 的低32位被写入,local APIC 就会根据 ICR 的值生成一条 IPI 信息,并发送到总线上。system bus (Pentium 4 and Intel Xeon processors) or the APIC bus (P6 family and Pentium processors)。
IPIv
IPIv (IPI virtualization) 是 Intel CPU 虚拟化技术 (VT-x) 引入的一个新特性,通过在硬件层面上提供支持,增强处理器间中断的虚拟化性能。具体可参考 Intel 向 linux 社区提交的 IPIv 补丁。
在硬件层面支持 IPI 虚拟化之前,guest 中的 vcpu 给目标 vcpu 发送 IPI 时,除了 self IPI 外都需要先触发 VM-exit,在 hyperviser 中完成中断的模拟,然后再触发 VM-entry 进入虚拟机,在目标 vcpu 上执行 IPI 处理程序。guest 和 hyperviser 之间的切换会带来一定的开销,影响 guest 的执行性能。IPIv 引入之后,guest 中的 IPI 均不会触发 VM-exit。