
085、PCIE MSI/MSI-X使能与配置从一次诡异的丢中断说起上周调一块自研的PCIE采集卡,DMA传输总是随机丢数据。逻辑分析仪抓波形,发现DMA引擎确实完成了传输,但主机侧就是没收到完成中断。查了半天,发现是MSI配置寄存器没写对——BAR空间映射对了,配置空间也读了,偏偏忘了使能MSI能力结构的控制位。这种低级错误浪费了两天时间,今天就聊聊PCIE中断那点事。MSI:传统中断的终结者老式PCI设备用INTx边带信号线发中断,一根线多个设备共享,还得走中断控制器路由。PCIE把这套彻底扔了,改用MSI(Message Signaled Interrupt)机制——中断不再是电气信号,而是一段特殊的内存写事务(MWr TLP),直接往CPU预设的地址写预设的数据。为什么这么设计?首先消除共享线带来的冲突和仲裁开销,其次每个中断向量独立送达,避免中断服务程序里轮询状态寄存器。更重要的是,MSI天生支持多向量,一个设备可以申请多个中断号,不同事件走不同向量,大大减轻ISR负担。MSI能力结构解剖找MSI配置空间得先扫能力链表。标准配置空间0x34指向第一个能力结构指针,顺着Next指针链式查找,Capability ID 0x05就是MSI。// 典型的MSI能力结构布局(32位地址版本)