1.简介:
PCIe中断支持三种传输方式:
• Legacy: 也称传统中断,Legacy PCI中断机制,每个PCI设备最多支持四个中断信号(边带信号:INTA# INTB# INTC# INTD#)
• MSI(Message Signaled Interrupt): Post Memory Write,只支持32个中断向量
• MSI-x: MSI的升级,最多支持2048个中断向量
2.传统中断
1. PCI设备通过INTx边带信号产生中断请求,经过中断控制器后转换为INTR信号,并直接发送至CPU
2. CPU收到INTR信号置位后,知道了中断请求的发生,但其并不知道是什么中断请求,因此CPU通过中断应答来查询中断请求信息
3. 中断应答被发送至PIC后,PIC会返回一个8bits的中断向量值给CPU
4. CPU收到中断向量值后,去Memory中的中断向量表中查找对应的中断服务程序在memory的位置
5. CPU读取ISR程序,然后处理该中断
1. 配置空间Command Register的bit10可禁止/使能INTx中断;但不会影响MSI&MSI-x
2. 配置空间Status Register的bit3表示中断状态
3. 配置空间Interrupt Pin定义中断边带信号引脚号
4. 配置空间Interrupt Line定义中断向量号
MSI本质上是一种Memory Write. MSI相关的寄存器存在于配置空间前256Bytes中.支持32个中断向量。
3.MSI中断
MSI本质上是一种Memory Write. MSI相关的寄存器存在于配置空间前256Bytes中.支持32个中断向量。
• Capability ID:只读,05h表示支持MSI功能
• Next Capability Pointer:只读,用于查找下一个Capability structer的位置,值为00h则表示到达Linked list的最后.
• Message Control Register:用于确定MSI的格式与支持的功能等信息
• Mask Bits:中断屏蔽位,可屏蔽对应MSI信息的发送
• Pending Bits:相关中断未屏蔽时,发生了相关中断,对应的bit置位,一旦该中断被发出,该位立即清零
4.MSI-x
MSI-x是MSI的改进,本质上也是一种Memory Write. 支持2048个中断向量,占用更少的配置空间.中断向量信息被存储在特殊的Memory(MMIO)中,该memory指向Table BIR(Base address Indicator Register)
5.区别
传统中断在PCIe中也是基于消息的,那么那他与MSI中断的区别是什么呢
其一,共享中断带来的性能损失:
传统中断的中断引脚常常被多个设备共享. 当中断触发时, 内核必须依次触发每个设备相应的中断处理,这必将损失系统的整体性能. 每个MSI中断属于设备所独有,因此不会产生共享中断带来的性能损失。
其二,传统中断超前产生,实际数据并未真正达到:
众所周之,中断通常是设备发送完数据后,给CPU一个中断通知CPU进行处理。但是这种看似简单的应用如果是传统中断也会产生问题,那就是,中断已经产生,并且数据也已经从设备发出,但是实际上并没有到达主存。这时候CPU是读不到它想要的数据的。在这种情况下,CPU必须从设备端读取寄存器来知道数据是否真的已经到达目的地,PCI事物排序规则确保该寄存器只有在数据真实到达之前才会更新。这是传统中断的另一弊端,而MSI中断因为与数据包共享同一通路并且有严格的先后顺序,所以不会出现这种问题,更不需要更新和查询设备端寄存器,从而节省了很多开销。
其三,每个设备最多只有四个传统中断引脚:
对于多功能PCI设备而言,每一个功能最多只有一个中断引脚。设备驱动程序必须查询设备产生的具体事件,势必降低中断处理速度。而一个设备可以支持最多32个MSI中断,每个中断有其特定功能,譬如,一些一场情况和错误处理有其单独的中断能让驱动程序处理如数据收发中断更有效。