ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

从开机自检到Option ROM:PCIe设备启动流程全解析

从开机自检到Option ROM:PCIe设备启动流程全解析 1. 从按下电源键到OS接管一次完整的开机自检之旅很多人调PCIe设备时习惯性地把目光盯在驱动、BAR空间、DMA中断这些“上层建筑”上一旦遇到设备不识别、Option ROM不生效、或者启动阶段黑屏卡死就一头扎进驱动代码里翻找。但老实说有不少问题其实根子在BIOS/UEFI阶段的PCIe枚举和Option ROM加载上——这一层没打通操作系统根本见不到你的设备驱动写得再漂亮也白搭。这篇是PCIe科普系列的第二篇接上一篇的链路训练和拓扑结构话题专门讲清楚两件事机器从上电到操作系统接管中间到底发生了什么以及PCIe设备的Option ROM是在哪个环节、以什么方式被找到并执行的。搞清楚这两条线你在调试FPGA PCIe板卡、独立网卡/RAID卡的启动兼容性甚至排查BIOS里看得到设备但引导时就是起不来这类玄学时会少走很多弯路。适合的读者包括写过或者正在写PCIe驱动的同学做FPGA PCIe原型验证的硬件工程师搞BIOS/BMC开发和板卡bring-up的同行以及纯粹想理解电脑启动过程的好奇型玩家。不需要你有多深的BIOS开发经验只要对PCIe配置空间有基本概念就能跟得上。先给一张总览图把整个自检过程的时间线大致列出来后面每个阶段再展开细讲阶段主要动作PCIe相关事件上电/复位CPU复位固件入口执行各设备复位链路进入detect状态CPU/内存初始化微码加载内存控制器训练不影响PCIe但失败会卡住后续流程主桥/总线枚举准备定位Host Bridge/Root Complex分配Bus Number 0准备配置访问PCIe枚举递归扫描总线发现设备配置空间读取设备号/功能号识别资源分配BAR空间、总线号、中断引脚分配内存/IO地址窗口写入BAROption ROM扫描遍历已枚举设备查找扩展ROM读取0x30 Expansion ROM BAR映射并执行启动设备选择按Boot Order寻找可引导设备调用对应设备的启动协议/INT 19hOS接管Bootloader运行OS内核初始化重新枚举PCIe加载原生驱动从这张表能看出来PCIe设备在固件阶段其实要被“翻牌”两次一次是枚举建拓扑、分资源一次是找Option ROM、尝试引导。这两次都通过了设备才算真正入了固件的法眼。2. 开机自检的核心逻辑枚举、资源分配与设备发现的先后顺序2.1 为什么UEFI要先“看见”设备才能让OS“用好”设备从纯软件角度想操作系统完全可以自己扫描PCIe总线、自己分配BAR、自己加载驱动那为什么还需要BIOS/UEFI先做一遍枚举和分配这个问题的答案直接关系到你理解整篇文章。核心原因有三个。第一固件需要在引导阶段找到启动设备。如果你的系统盘是NVMe SSD而NVMe控制器挂在PCIe总线上那固件就得先能访问PCIe配置空间才能找到这个控制器进而通过NVMe协议读取引导扇区和EFI启动文件。第二平台资源需要在OS加载前完成初步分配。有些老式设备或Legacy Option ROM固件依赖固定的内存窗口、IO端口甚至中断线这些资源如果等OS起来再分配设备固件可能压根儿没法完成自身初始化。第三错误隔离和可诊断性。UEFI阶段如果某个PCIe设备导致bus error或者无法完成枚举固件可以通过POST code、蜂鸣码、屏幕错误信息等方式告诉你哪个槽位出了问题——这些信息在OS环境里反而不容易拿到。换个生活化的类比固件做枚举相当于物业在业主入住前先把整栋楼的房源清点一遍登记每户位置、量好面积、划好公共区域再把钥匙交接给OS这个“新物业”。OS虽然可以重新丈量、重新分配但前提是最初的房底子得是清楚可靠的。2.2 枚举到底是怎么“扫”出来一棵PCIe树的PCIe枚举的起点是Host Bridge/Root Complex暴露出来的Bus 0。固件从Bus 0、Device 0、Function 0开始逐个读取配置空间里的Vendor ID和Device ID——如果读回来是全F即0xFFFFFFFF说明这个位置上没有设备跳过如果读到合法ID就认为这里挂了一个多功能设备或者单功能设备然后递归往下扫。这里的“递归”是关键。每个PCIe-to-PCI桥包括根端口Root Port和Switch下游端口都有Primary Bus Number、Secondary Bus Number和Subordinate Bus Number三个寄存器。固件的枚举算法大致是读当前总线上每个Device/Function的Vendor ID发现设备或桥。如果是桥先给它的Secondary Bus分配一个新的总线号然后在这条新总线上继续递归扫描。递归完成后把该桥的Subordinate Bus Number设为“其下游所有总线中最大的那个编号”。继续扫当前总线的下一个Device。这个过程在PCIe时代有一点需要特别注意——链路训练必须先完成。传统PCI是并行总线设备只要上电就“在”总线上配置访问一打就能读到PCIe则不同设备要经过detect、polling、configuration等链路训练状态链路状态进入L0之后配置请求才能穿透物理层送达对端。所以固件在枚举之前通常需要等待根端口的链路训练完成并读取Link Status寄存器确认链路速度和宽度。如果对端设备没插好、金手指接触不良或者链路训练失败根端口看到的Link Status就是“无链路”枚举自然扫不到东西。这也就是为什么在调试自研PCIe设备时经常看到“FPGA配置已经加载了但主机BIOS里看不到设备”的现象——多数情况下不是配置空间寄存器写错了而是链路训练压根没完成或者训练成功了但Link Active信号没被正确拉起来。检查链路训练状态永远是第一步。2.3 BAR空间分配为什么你的FPGA设备内存窗口老是对不上枚举发现了设备只是第一步。设备配置空间里有6个BAR寄存器Base Address Register每个BAR描述了设备需要的一段内存或IO地址空间的大小和属性可预取/不可预取、32位/64位等。固件的资源分配阶段要做的事情就是为每个BAR找到一段满足要求的系统地址窗口把起始地址写入BAR。这里有个经典的自测方法新手经常理解不了为什么“写全1再读回来”就能知道BAR大小。原理是BAR空间的大小必须是对齐的且由硬件在实现时固定死某些位段不可写。固件往BAR里写0xFFFFFFFF然后读回读到的值里低位那些被清0的位就反映了BAR空间的大小。比如一个需要1MB内存空间的设备BAR的低20位是只读0的写全1后读回低20位就是0固件据此算出该BAR需要1MB且起始地址必须1MB对齐。在你自己的PCIe设备上这块有几个容易出问题的地方64位BAR处理不当。如果一个设备声明了64位BAR它会占用BAR0和BAR1两个寄存器固件分配时必须把高32位和低32位当作一个连续的64位地址来处理。如果你的FPGA逻辑把64位BAR当成两个独立的32位BAR来响应固件读回BAR1时会发现“意外”的高位地址导致分配错乱。BAR空间对齐要求不满足。某些型号的FPGA PCIe硬核对BAR大小声明和实际内存窗口的对齐要求比较特殊固件分配完地址后你设备内部解码逻辑如果按错误的掩码去截断地址就会出现“驱动读得到BAR但实际访问不到设备内存”的诡异现象。Expansion ROM BAR被忽略。配置空间0x30偏移处的Expansion ROM BAR专门用于映射Option ROM它和普通BAR的地址分配逻辑类似但仅在固件扫描Option ROM阶段会被用到。很多自研设备忘了实现这个BAR导致设备本身功能正常但固件永远找不到它的引导ROM——后面讲Option ROM加载时再细说。资源分配的最终结果是每个PCIe设备都获得了一组确定的总线号、设备号、功能号和BAR地址。这些信息被保存在固件维护的“PCIe配置数据库”里后续Option ROM扫描、Boot Device Select以及OS引导时的EFI PCIe I/O Protocol都依赖这份数据。3. Option ROM到底是个什么东西类型、格式和运行环境3.1 固件代码的“快递箱”从Legacy Option ROM到UEFI DriverOption ROM全称Option Read-Only Memory是一段存放在设备上的固件代码设备自己不带大容量存储但会在出厂时把这套代码烧进一个芯片常见于网卡、RAID卡、显卡。当固件完成PCIe枚举后会扫描每个设备是否有Option ROM如果有就把这段代码映射到处理器可执行的地址空间并跳转执行。需要区分的是Option ROM在传统Legacy BIOS和UEFI环境下是两种不同的东西对比项Legacy Option ROMUEFI Option ROM (UEFI Driver)文件格式二进制镜像通常以0x55AA开头PE32格式的EFI image带特定子系统类型执行方式实模式通过INT 19h链或INT 13h磁盘服务交互由UEFI固件加载通过EFI Driver Model绑定到设备入口调用固件扫描到0x55AA签名后调用初始化入口固件识别到PE/COFF头后加载并StartImage典型用途网卡PXE引导、RAID卡接管磁盘、显卡VGA输出网卡UEFI PXE、NVMe引导、RAID卡UEFI驱动等运行环境16位实模式处理器直接执行32位/64位保护模式UEFI运行时服务可用Legacy Option ROM里最常见的是PCI 3.0规格定义的扩展ROM头部Expansion ROM Header前两个字节是0x55AA偏移0x1A处有指针指向PCI Data Structure其中包含设备ID、厂商ID、Class Code、代码长度等信息。固件通过这个结构判断“这段ROM是不是给我这个设备用的”再决定是否继续加载。UEFI Option ROM则是彻底的PE32可执行文件文件头里有EFI子系统类型0x0B表示EFI Boot Service Driver会被UEFI固件当作一个驱动镜像来加载。简单说Legacy Option ROM像是DOS时代的一个小程序直接裸跑在实模式UEFI Option ROM则像个正式的驱动模块被UEFI的驱动模型管理生命周期。3.2 显卡、阵列卡、网卡各自是怎么用Option ROM干活儿的不同类型的设备对Option ROM的依赖和用法差别很大这也是很多人“知其然不知其所以然”的地方。显卡的Option ROM又称VGA BIOS或UEFI GOP Driver是最特殊的一类。Legacy模式下显卡Option ROM会在POST阶段被加载然后拦截INT 10h中断提供文本模式和基础图形输出能力——POST过程中的“Press F2 to enter Setup”提示就是靠它在屏幕上画出来的。UEFI模式下这个角色由Graphics Output ProtocolGOP驱动替代UEFI固件加载显卡的GOP驱动后会调用它的查询/设置显示模式接口来做开机logo、进度条和Setup界面的高分辨率输出。RAID卡的Option ROM则是另一种典型。RAID卡在系统OS驱动加载之前就得接管所有挂载在其端口上的磁盘向固件提供一个“虚拟磁盘”视图。Legacy下它通过INT 13h磁盘服务实现——BIOS引导时调用INT 13h读取引导扇区RAID卡的Option ROM拦截这个中断把RAID组里的虚拟盘映射给BIOS。UEFI下则是通过Driver Model绑定到PCIe设备生产一个Block I/O Protocol handle来代表虚拟磁盘。如果你用过老式LSI/SAS阵列卡开机时看到那个“Press CtrlC to enter Configuration Utility”的等待画面那就是它的Option ROM在干活。网卡的PXE Option ROM也值得一提。PXE规范定义了网络启动的完整流程固件加载网卡Option ROM后Option ROM代码通过UDP/TFTP协议从PXE服务器下载引导程序到内存然后跳转执行。Legacy下这个过程依赖INT 19h引导服务和INT 13h风格的磁盘抽象UEFI下则有EFI_PXE_BASE_CODE_PROTOCOL来封装。调试网络启动时经常遇到的“PXE-E61 Media test failure”本质就是网卡Option ROM在媒体检测阶段没找到网线链路这种消息的打印源头就是Option ROM代码本身而不是主板固件。4. 加载机制拆解固件如何找到、校验并执行Option ROM4.1 Legacy和UEFI下完全不同的“寻宝”路径前面说的是Option ROM是什么接下来是整个流程最微妙的一环——固件究竟通过什么路径找到它并把它跑起来。Legacy BIOS下的路径相对直接。固件在PCIe枚举和资源分配之后会再次遍历所有设备对每个设备读取配置空间0x30处的Expansion ROM Base Address寄存器。这个寄存器平时是0表示该设备没有声明Option ROM如果非0固件会先把一段地址写入这个BAR这个BAR在配置空间里的位置比较特殊它不是通过标准BAR寄存器而是固定在0x30偏移处把Option ROM的内容映射到内存地址空间然后到映射区域的开头检查两个字节是否等于0x55AA。确认签名后固件读取PCI Data Structure里的代码类型、代码长度、设备ID等信息判断这段ROM适用于当前设备再跳转到初始化入口执行。整个过程中处理器处于实模式ROM代码可以直接访问BIOS中断服务。如果设备是显卡它的Option ROM里还会有一个特殊签名标记用于VGA ROM的识别。UEFI路径则完全不同也更“结构化”。UEFI固件同样通过0x30 BAR找到并映射Option ROM但读到的不再是0x55AA而是MZ头和PE/COFF头。固件会把这个EFI image加载到内存解析导入表、重定位表然后按EFI Image Entry Point规定的入口地址执行。执行前固件会为该image建立Load Image/Start Image上下文image内部再通过UEFI Boot Services里的InstallMultipleProtocolInterfaces等方式将自己注册为某个设备上的Driver Binding Protocol实例。之后固件跑Driver Model的连接流程调用该驱动的Supported/Start接口让设备真正“活”起来。你可能会问UEFI规范不是支持同时兼容Legacy Option ROM吗没错纯UEFI固件配合CSMCompatibility Support Module时可以加载Legacy Option ROM。但实际主板固件里CSM一开启整个引导流程就退回BIOS模式UEFI驱动方式的启动项可能会失效这是很多人在主板设置里折腾“CSM开/关”时容易混淆的根源。4.2 执行顺序和时间点为什么你的Option ROM必须等枚举完才能跑Option ROM加载还涉及一个执行先后问题——不是枚举一结束就马上逐个加载所有设备的ROM而是有明确的时序。UEFI规范里定义了Option ROM加载发生在DXE阶段后期、BDSBoot Device Select阶段之前Legacy BIOS则是在POST的后半段紧接在资源分配之后。这个时序设计是刻意的原因有二第一Option ROM代码本身也要访问设备的BAR空间。比如RAID卡ROM要访问控制器的寄存器、网卡ROM要访问收发缓冲区的MMIO地址。如果资源还没分配好BAR是无效的ROM代码一访问就总线错误。所以先枚举分配资源、再加载Option ROM是逻辑上的必然。第二多个Option ROM之间可能存在依赖关系。例如独立显卡需要先加载VGA ROM主板固件才能用它的输出做后阶段的POST错误显示RAID卡的Option ROM则可能需要调用固件提供的磁盘服务协议。UEFI的Driver Model用“连接”的概念管理这种依赖比Legacy时代的“后加载者覆盖前加载者”的INT中断链方式要优雅得多。有一个比较重要的细节UEFI固件在加载Option ROM之前会先检查该ROM的Secure Boot签名状态。如果系统开启了Secure BootOption ROM也必须携带有效的签名否则固件会拒绝加载它。这就导致了一个常见的故障现象——某些老型号的独立网卡或阵列卡在开启Secure Boot的主板上网络引导或磁盘接管功能会莫名失效而固件界面里又看不到明确的报错信息。排查方向之一就是临时关闭Secure Boot看功能是否恢复以此判断是不是签名问题。4.3 常见Option ROM加载失败的报错信息与根因对照做调试这些年我总结过一张很实用的“报错/故障现象到根因”的对照表方案从简单到复杂排列分享出来现象出现时机可能根因排查建议BIOS里看不到设备枚举阶段链路训练未完成、金手指接触不良、配置空间ID非法先查Link Status再量PERST#、参考时钟设备可见但Option ROM不加载ROM扫描阶段0x30 BAR未实现、Option ROM签名错误、PCI Data Structure损坏用调试器读配置空间0x30检查ROM内容开机卡在某个设备的ROM初始化画面ROM执行阶段ROM代码自身bug、依赖的资源窗口冲突、设备固件与ROM版本不匹配最小化硬件配置逐槽位排除冲突UEFI下网卡无法网络引导BDS阶段Secure Boot签名缺失、UEFI ROM未烧录、驱动模型连接失败确认ROM是UEFI版本临时关Secure Boot测试显卡POST过程花屏/黑屏显示初始化早期VGA ROM与主板固件兼容性问题、显示BAR窗口分配异常换槽位、更新显卡固件、确认有无UEFI GOP驱动值得单拎出来说的是“设备可见但Option ROM不加载”这一类。根据PCIe规范如果一个设备没有实现Expansion ROM BAR0x30偏移处全是0固件就没有任何途径去映射并执行它的Option ROM。很多自研PCIe设备逻辑设计时觉得“反正OS里有驱动不需要固件阶段干点什么”于是没实现这个BAR结果没想到做PXE启动或者VGA输出时只能干瞪眼。5. 一个实操视角FPGA PCIe设备Option ROM调试中的三个真实案例5.1 案例一设备枚举正常但固件总是跳过Option ROM去年帮一个团队调试基于某款中端FPGA的自研PCIe加速卡现象是设备能被BIOS正确枚举BAR空间分配也正常但Option ROM始终不加载。抓配置空间寄存器时发现0x30处的Expansion ROM BAR数值是0设备驱动逻辑里压根没写这个寄存器。检查FPGA的PCIe硬核配置后发现这块FPGA硬核确实暴露了一个Expansion ROM的接口但需要在构建工程时显式启用。很多人不知道的是即便你在FPGA逻辑里写了一个合法的Option ROM源文件如果硬核IP里的“Enable Expansion ROM”选项没勾上硬核根本不会把它暴露给配置空间访问。修复方法是在IP配置界面勾选该选项重新综合生成比特流Option ROM的加载就正常了。这个案例的核心教训是Option ROM的加载前提不仅仅是设备代码里有ROM内容还牵涉到PCIe硬核是否把ROM地址窗口开放给了处理器访问。5.2 案例二RAID卡在UEFI模式下虚拟磁盘丢失Legacy模式却正常另一个来自服务器平台的案例。一块中高端RAID卡在Legacy模式下引导、安装系统、进系统都能看到虚拟磁盘一旦切成纯UEFI引导模式固件阶段就找不到RAID组里的虚拟盘系统自然无法从磁盘启动。初看像是Option ROM的UEFI版本没烧对但刷写最新UEFI ROM也无济于事。后来仔细检查发现问题出在这块RAID卡固件里的UEFI Driver对系统内存映射的要求很苛刻而该服务器在某个内存配置比如插了特定容量的DIMM下UEFI固件分配给他的Option ROM装载空间不满足驱动要求。最终处理方案是调整主板的“Above 4G Decoding”选项——这个选项控制是否把64位BAR空间映射到4GB以上地址。RAID卡固件的UEFI Driver在初始化时会检查系统是否支持64位地址窗口如果平台固件没开启Above 4G Decoding某些资源获取路径就会失败驱动自然绑定不上虚拟磁盘也就出不来了。这个案例提醒我Option ROM的执行效果不止取决于ROM自身代码还和平台固件的各种地址窗口策略纠缠在一起。5.3 案例三网卡PXE引导时好时坏最后发现和Hub的电源管理有关第三个案例比较偏门但很有代表性。一块工控主板板载Intel网卡Legacy模式下PXE引导经常出现“PXE-E61”或“Media test failure”的间歇性报错有时候重插网线就好有时候要重启两三次才成功。常规排查先换网线、换交换机端口问题依旧。后来在固件调试日志里发现网卡Option ROM加载后做媒体检测时链接速度协商还没有稳定完成报错是因为在协商完成前就超时了。再往上追问题出在供电的交换机上——这台交换机的某些端口开启了EEE节能以太网导致网卡PHY的链接参数协商速度变慢PXE ROM预设的等待时间不够用。处理方法是到交换机端口上关闭EEE省电模式问题彻底消失。这个案例的通用价值在于Option ROM的执行环境不是纯软件黑盒它依赖链路物理层的稳定状态尤其对网卡这类“先建链后服务”的设备任何让链路训练变慢的因素都可能让固件产生误判。6. 当自检失败时从PCIe错误记录到“无法启动”的完整排查链路Option ROM加载失败虽然烦人但通常只影响特定功能的可用性。更严重的问题是PCIe设备在自检阶段报出总线错误导致整个POST流程卡死。这种情况下调试思路要有清晰的优先级。PCIe总线错误分两类Completer AbortCA和Master AbortMA。简单说CA是请求方发出的请求被对端明确以“完成者中止”的形式打回MA是请求发出去但总线上根本没有任何设备响应超时中止。这两种错误在固件阶段如果处理不当轻则记录一条WHEA错误重则直接进入死循环不得超脱。碰上自检阶段的PCIe错误我的排查顺序一般是这样先判断错误来源。用BIOS调试卡POST code卡或者串口日志找到报错时的总线号、设备号确认是哪条总线上的哪个设备触发了错误。缩小范围到物理链路。通过根端口的Link Status寄存器判断是链路根本没起来detect失败还是链路起来了但配置访问阶段出错如设备ID响应异常。检查配置空间访问是否“先抢后问”。有些自研设备在复位释放后需要一段内部初始化时间才能响应配置请求固件如果立刻去读Vendor ID设备可能回一个全F或者直接CA。解决办法是在设备逻辑里保证复位后固定时间窗口内能稳定响应配置访问而不是依赖固件端加重试。对照资源分配。常见的一个坑是设备BAR声明的大小过大导致固件分配的空间跨越了某个平台限制区域。尤其是FPGA验证时BAR空间动辄设置成64MB、128MB而有些老平台固件对PRT窗口有大小限制BAR分配失败会连带让整个设备“不可用”。最后再怀疑Option ROM。如果枚举、资源分配都正常但设备一旦有Option ROM且加载后死机就要考虑ROM代码本身是否有内存破坏、中断冲突之类的问题。这种情况可以用替代法——暂时清空设备的Option ROM烧一个空的镜像看系统是否恢复正常以锁定是ROM代码的问题还是设备逻辑本身的问题。有一条经验绝大多数情况下都适用PCIe自检阶段的问题九成以上出在物理层链路训练或配置空间时序上而不是Option ROM代码本身。先把链路、复位、参考时钟这些底子检查清楚再纠结代码和协议细节会高效很多。7. 从Boot到OSOption ROM执行完毕后的最后一棒交接Option ROM加载完成不代表引导流程就结束了。真正决定“从哪个设备启动操作系统”的是固件的BDSBoot Device Select阶段。Legacy模式下Option ROM通过修改INT 19h的跳转链来“抢占”引导权。系统固件按Boot Order扫描引导设备时先询问INT 19h链上是否有设备要接管引导。RAID卡、网卡这类设备的Option ROM在初始化时就把自己的INT 19h处理程序挂到了链上固件一问它们就站出来说“我能引导”。随后固件把控制权交给这个处理程序Option ROM再做自己的设备选择最终通过INT 13h把引导扇区读入内存跳转执行。UEFI模式下整个交接更规范。每个被Option ROM驱动“激活”的设备都会在固件里注册为带Block I/O Protocol或Simple File System Protocol的handle。BDS阶段遍历这些handle按Boot Order读取启动项逐个尝试LoadImage和StartImage把引导程序从设备上加载到内存并执行。这也解释了为什么某些设备在Legacy下能引导、UEFI下不能。最典型的就是部分老型号PCIe NVMe转接卡——它们只烧了Legacy Option ROM没有UEFI Driver。在纯UEFI引导模式下固件扫描不到加载NVMe控制器的EFI驱动自然看不到NVMe盘上的EFI引导分区启动项里就一片空白。反过来有些新设备只提供UEFI ROMLegacy模式下也会静默失效。在做平台兼容性测试时我建议至少覆盖三种模式纯UEFI、纯Legacy、UEFICSM。很多“这块卡在我主板上不识别”的问题往往只是模式不匹配而不是硬件损坏。8. 从固件日志到Option ROM签名几个容易被忽略的实用检查点分享一些实操中积累的小习惯这些细节在文档里不容易找到但排查问题时非常管用。善用固件日志。绝大多数x86平台的UEFI固件都支持串口日志Serial Debug或内存日志里面会记录PCIe枚举的完整过程每个根端口的链路速度/宽度、每层桥的总线号分配、每个设备的BAR分配结果、Option ROM扫描的成败日志。启用方法多为在Setup界面或者通过BIOS配置工具设置串口重定向和Debug Level。拿到日志后直接搜索你设备的Vendor ID或者总线号往往能精确看到它“卡死”在哪一步。检查Option ROM的PCI Data Structure。如果怀疑是自己设备ROM内容不对用UEFI Shell或者Linux下的lspci -xxx把配置空间dump出来看0x30偏移的BAR是否有效再把ROM映射到内存后检查0x55AA签名和PCI Data Structure里的字段。很多“固件不加载ROM”的问题其实就是PCI Data Structure里声明的设备ID和配置空间里的设备ID不一致固件认为“这个ROM不属于这个设备”拒绝加载。搞清楚Secure Boot对Option ROM的影响。开启Secure Boot后固件只加载带合法签名的UEFI Option ROM。对于开发阶段的调试板卡最直接的办法是临时关闭Secure Boot专注验证功能发布阶段再做签名。有些板卡厂商出厂时ROM签名错误或证书过期也会造成同类问题。关注PCIe ACSAccess Control Services的开关状态。这个更偏虚拟化场景但自检阶段也有关联。ACS特性如果被固件错误地开启在某个Switch端口上可能会导致DMA访问、配置访问被拦截出现“设备明明枚举到了但一访问就超时”的现象。新平台固件里通常有ACS控制的隐藏选项需要特定的Setup变量或工具才能调整。这些检查点环环相扣从物理层到固件策略再到签名体系任何一个环节出问题都可能让你在PCIe自检这条链路里兜圈子。好在PCIe的调试相对透明——链路状态有寄存器可读、配置空间有协议可依、固件日志有流程可追只要按图索骥总能找到病因。这也是我偏爱在这个方向上做深入调试的原因它复杂但从不无理取闹。
返回列表