1、为什么需要中断
为了能够让一些优先级高的事务得到优先处理,PCI总线支持外设中断用以提高总线性能。
2、中断的多种方式
PCIe总线继承了PCI总线的所有中断特性(包括INTx和MSI/MSI-X)
3、PCIe中断--INTx
PCI总线使用INTA#、INTB#、INTC#和INTD#信号向处理器发出中断请求。这些中断请求信号为低电平有效,并与处理器的中断控制器连接。在PCI体系结构中,这些中断信号属于边带信号(Sideband Signals),PCI总线规范并没有明确规定在一个处理器系统中如何使用这些信号,因为这些信号对于PCI总线是可选信号。所谓边带信号是指这些信号在PCI总线中是可选信号,而且只能在一个处理器系统的内部使用,并不能离开这个处理器环境。
3.1、PCI INTx中断流程
一个简单的PCI总线INTx中断实现流程,如下图所示(单核CPU)。
1、首先,PCI设备通过INTx边带信号产生中断请求,经过中断控制器(Interrupt Controller,PIC)后,转换为INTR信号,并直接发送至CPU;
2、CPU收到INTR信号置位后,意识到了中断请求的发生,但是此时并不知道是什么中断请求。于是通过一个特殊的指令来查询中断请求信息,该过程一般被称为中断应答(Interrupt Acknowledge);
3、该特殊指令被发送至PIC后,PIC会返回一个8bits的中断向量(Interrupt Vector)值给CPU。该中断向量值与其发送的INTR请求是对应的;
4、CPU收到来自PIC的中断向量值后,会去其Memory中的中断向量表(Interrupt Table)中查找对应的中断服务程序(Interrupt Service Routines,ISR)在Memory的位置;
5、然后CPU读取ISR程序,进而处理该中断。
多核CPU的简单图示如下:
4、PCIe中断-MSI/MSI-X
对于PCIE设备,一般支持MSI中断和MSIX中断,MSI和MSIX中断都是通过对某个映射内存区域写数据(写的地址为Message Addr,写的数据为Message Data),从而触发基于信息的中断。MSI和MSIX的差异点主要有两点:
1、产生MSI中断的内存映射区在PCIE设备的配置空间,而产生MSIX中断的内存映射区在PCIE设备的BAR空间;
2、MSI中断最多支持32个,且要求申请的中断连续,而MSIX中断可支持的比较多(2048),不要求申请的中断连续;
MSI有四种类型如下图所示:
其中Capability ID的值是只读的,05h表示支持MSI功能。
Next Capability Pointer也是只读的,其用于查找下一个Capability Structure的位置,其值为00h则表示到达Linked List的最后了。
当Mask Bits将相关的中断向量(Interrupt Vector)屏蔽后,该MSI将不会被发送。软件可以通过这种方式来使能或者禁止某些MSI的发送。
如果相关中断向量没有被屏蔽,则如果发生了相关中断请求,这时Pending Bits中的相应bit则会被置位。一旦中断信息被发出,则该bit会立即被清零。
MSIX中断相关寄存器如下所示: