Bios实习 学习篇- 5.PCIe学习(1)
1.pcie概念
PCIe 不是“很多设备挂在一根总线上的传统 PCI”,而是一种分层、分级、点对点的高速串行互连。 对 BIOS/UEFI 来说,PCIe 最重要的不是“线有多快”,而是 上电后怎么把链路训起来、怎么枚举设备、怎么给设备分配地址空间和总线号、怎么把这些信息交给操作系统
2.为什么 PCIe 这么重要
因为现代高性能外设几乎都围着它转: GPU 走 PCIe NVMe SSD 走 PCIe 很多高性能 NIC、加速卡、FPGA 卡也走 PCIe CXL 的物理承载层也建立在 PCIe 之上,不过那是更后一层的话题
所以,学 PCIe,本质上是在学现代平台 I/O 的主干道。对 BIOS 工程师来说,不懂 PCIe,很多上电异常、设备丢失、资源冲突、启动卡死都会像雾里看花。
PCIe 子系统的初始化是平台初始化的核心环节之一。整个流程遵循 "桥接器→总线→设备→功能" 的层级扫描模式
CPU ↔ PCI Host Bridge ↔ PCI Root Bridge ↔ PCI Bus ↔ PCI Device ↔ PCI Function
3.PCI Host Bridge Protocol核心概念
PCI Host Bridge 是连接 CPU 系统总线和 PCI 总线的桥梁,负责:
- 地址空间转换(CPU 物理地址 ↔ PCI 总线地址)
- 中断路由
- 总线事务转发
在 EDK2 中,每个平台通常有一个或多个 PCI Host Bridge 实例,每个实例管理一个或多个 PCI Root Bridge。
4.PCI Enumeration(PCI 枚举)
DXE 阶段的 PCI 枚举由PciBusDxe驱动完成,完整流程如下:
1.初始化阶段
定位所有 PCI Host Bridge Protocol 实例
为每个 Host Bridge 创建 PCI Root Bridge I/O Protocol 实例
2.总线扫描阶段
从总线号 0 开始,扫描每个总线上的所有设备(0-31)和功能(0-7)
读取配置空间的 Vendor ID 和 Device ID,判断是否存在设备
如果发现 PCI-PCI 桥或 PCIe 桥,递归扫描下游总线
3.资源需求收集阶段
读取每个设备的 BAR(Base Address Register),计算所需的内存和 I/O 资源
收集所有桥的总线号需求(次级总线号、从属总线号)
按资源类型和对齐要求进行排序
4.资源分配阶段
分配总线号范围
分配 I/O 资源范围
分配 32 位内存资源范围
分配 64 位内存资源范围
将资源分配结果写入设备的 BAR 和桥的配置寄存器
5.设备初始化阶段
启用设备的内存和 I/O 空间访问
配置设备的中断线
为每个 PCI 功能创建 PCI I/O Protocol 实例