出于向下兼容的需要,PCIe完全继承了PCI的所有的中断特性(包括INTx,MSI/MSIx)。但是与PCI不同的是,PCIe使用串行总线尽量减少pin的使用,所以对于INTX类型的中断,它没有使用sideband pin的方式而是使用Message传递中断。另外对于PCI, MSI/MSIX是可选的但是PCIe设备必须支持MSI/MSIx的中断请求机制,可以不支持INTx中断消息。
INTx 中断:
在详细介绍PCIe的中断机制之前,我们先来回顾一下PCI时代传统的中断处理过程。下图是一个典型使用PCI设备的单处理器的系统。在这个系统中设备通过INTA#产生中断,INTA#链接到南桥PIC的IRQ上,PIC再通过INTR连接到CPU上。在这样的一个系统中,中断的传递流程如下所示:
- 设备通过连接到中断控制器PIC的INTA#请求中断,通常PIC有15个IRQ和1个INTR,它收到中断请求以后,它会拉INTR通知CPU有中断在等待处理中。
- CPU检测到INTR的信号以后,它会需要知道对应的中断向量,所以它会发一个中断响应命令给PIC。
- PIC 返回一个当前等待中最高优先级中断请求的8位的中断向量,该向量是由之前的系统软件设置的。
- CPU 按照中断向量找到对应的中断处理程序。
- 执行该中断处理程序并告诉设备释放INTx#信号线,程序返回到之前被中断的任务继续执行。
PCI spec 2.3在Command Register中引入了一个新的Interrupt Disable bit用来控制中断的enable和disable,该bit只会控制INTx类型的中断,不会影响MSIx。另外在Configuration Status Register加了一个Interrupt Status bit用来反应中断的状。
在PCI总线中,设备的INTx pin最终要连接到中断控制器的IRQ pin。通常在一个系统中会有多个设备,而且我们还可以通过桥扩展多个设备。这种情况下设备的INTx和中断控制器的连接方式要妥善的处理已达到负载均衡的目的。如下图的一个系统中,共有3个PCI插槽这些PCI插槽与中断控制器的IRQ_PINx引脚 (分别为IRQW#、IRQX#、IRQY#和IRQZ#)可以按照下图所示的拓扑结构进行连接。
PCI插槽 A、B、C 的 INTA#、INTB# 和 INTC# 信号将分散连接到中断控制器的 IRQW#、IRQX#和IRQY#信号,