三种中断触发模型:
1. Legacy PCI Interrupt Delivery
这是PCI 总线的中断方式,跟寻常理解的中断触发方式一样,通过引脚的电平信号触发。一共有四根中断线(INTA, INTB, INTC, INTD).在常规的系统中一般会将这四根中断线或在一起然后传递给中断控制器。
PCIe为了向下兼容,也为了减少引脚数量,也支持Legacy 中断方式,但是不再有INTA-D这样具体的硬件信号线。
主要场景如下图:
PCI/PCI-X 设备接入 PCIe Bridge,PCIe Bridge收到legacy interrupt的中断电平信号将其转成 INTx Message TLP包上发给RC,由RC将这个中断传递给中断控制器。
Legacy Interrupt 示例
PCI Device的INT信号接到南桥中断控制芯片PIC,PIC的中断信号INTR接入CPU
- 当Device发生中断事件,INTA硬件信号拉起,此时中断控制器PIC收到中断信号并把它发送给CPU(PIC控制的中断有很多,这些中断信号一起或给cpu)。
- CPU收到了中断,需要确认是哪个中断需要处理,于是通过处理器总线发出“Interrupt Acknowledge”的特殊指令
- PIC收到这个指令,会返回8-bit的Interrupt Vector来表示目前pending的最高优先级的中断向量
- CPU通过这个Vector从Interrupt Table中找到对应的handler。
- 在handler中完成业务,并向device下发指令拉低INTA信号
SMP系统支持
上面的示例是单CPU的情况下,SMP系统场景下,每个CPU都会有各自的业务,这些业务都会依赖device中断,所以先前的单cpu模型那种一根中断线的设计无法满足需求。硬件的中断信号线只有一根,如果接给一个cpu那没有问题,如果接给多个cpu,当中断发生,每个cpu都会收到中断信号,那么无论这个中断与这个CPU是否相关,每个cpu都要发出Interrupt Acknowledge给PIC查询,这样的设计冗余且低效而且混乱。
针对SMP系统推出APIC Model,有 IO-APIC(Advanced Programmable Interrupt Controller)这么个中断控制器。其中包含一个APIC bus和Logic APIC组件。
这样PIC与CPU连接的不再是硬件的中断信号,而是一个APIC bus连接在每个cpu的Logic APIC模块上,这个APIC bus上传递中断message,中断的message里包含了Interrupt Vector。
CPU在开始初始化各自的Logic APIC,静态分配中断,当中断产生,每个cpu的Logic APIC都会收到message,然后根据先前的配置,决定是否将中断报给CPU。因为先前已经配置好了,虽然每个Local APIC依然会收到这些message,但是CPU能够判断这这个中断的message是不是给自己的(甚至在Local APIC就能屏蔽掉不是给自己的中断)。
这个设计确实有了很多提升,上图中IO APIC向CPU传递中断的信号从单信号线变成了一个传递message的bus,但是对于外设(device)来说,其实它上报中断的手段并没有改变,还是中断信号线。在图上不难看出Device上报中断流