145、 PCIE BIOS/UEFI支持:那些年我在BAR空间踩过的坑凌晨两点,调试间里屏幕泛着蓝光。同事指着PCIe设备的配置空间问我:“为什么这个BAR读出来全是0xFF?系统启动时明明识别到了设备。” 我盯着Windbg里打印出的配置空间数据,突然意识到——这又是BIOS/UEFI初始化时埋下的雷。今天我们就来聊聊PCIe系统中那个既基础又关键的环节:BIOS/UEFI对PCIe的支持。冷启动时的PCIe世界按下电源键的瞬间,CPU从复位向量开始执行,此时PCIe总线还是一片黑暗。UEFI固件(或传统BIOS)的PCI总线驱动会执行枚举过程——这个过程就像在黑屋子里摸索着开灯。枚举器从总线0设备0功能0开始,读取每个可能位置的Vendor ID,0xFFFF表示设备不存在。发现设备后,配置头空间被初始化,包括最重要的BAR(Base Address Register)。我遇到过最诡异的问题:某定制板卡在Windows下工作正常,在Linux下却无法访问。用lspci查看,BAR地址分配明显不合理。根本原因是UEFI的PCI驱动在分配地址时,没有正确处理该设备的64位BAR需求,导致地址映射错乱。BAR分配:地址空间的舞蹈BAR分配不是简单的内存分配。系统需要为所有PCIe设备分配互不冲突的物理地址范围,同时考虑对齐要求。64位BAR需要两个连续的配置空间寄存器,并且地址必须按大小对齐。