082、PCIE原生控制与中断:从一次诡异的设备失联说起
082、PCIE原生控制与中断:从一次诡异的设备失联说起
上周调一块自研的PCIE采集卡,系统启动时设备能正常枚举,加载驱动后也能看到设备号。但只要一开始传输数据,系统运行几分钟后设备突然就从lspci列表里消失了,像是被热拔掉了一样。插拔复位后又能重新识别,周而复始。这种问题在PCIE调试里不算罕见,根因往往出在链路训练、电源管理,或者我们今天要重点聊的——中断与控制逻辑。
一、PCIE控制空间:那三个关键的配置区
PCIE设备暴露给系统最核心的窗口就是配置空间。别被“配置”二字骗了,这里头除了设备ID、厂商ID这些静态信息,更重要的是控制寄存器和状态寄存器。
每个PCIE设备都有256字节的标准配置空间,扩展模式下能到4KB。头64字节是必须实现的,里头藏着几个关键控制点:
// 假设我们在内核模块里访问配置空间pci_read_config_dword(pdev,PCI_COMMAND,&cmd