一、 PCIe基础知识
PCIe总线(协议简述):https://www.cnblogs.com/YINBin/p/10946247.html
PCI-Express(peripheral component interconnect express)是一种高速串行计算机扩展总线标准,它原来的名称为“3GIO”,是由英特尔在2001年提出的,旨在替代旧的PCI,PCI-X和AGP总线标准。
与大多数总线一样,PCIe总线也包括电气属性和协议组成两部分。完整地了解PCIe是相对复杂的,所以从应用角度来讲,我先从基本的协议入手,对PCIe有个初步的认识。拓展学习可以参考官方协议规范文档《PCI Express Base Specification》。
PCIe 规范对于设备的设计采用分层的结构,有事务层、数据链路层和物理层组成,各层有都分为发送和接收两功能块。
在发送端,应用程序(设备核A)在事务层形成事务层包(TLP——Transaction Layer Package),储存在发送缓冲器里,等待推向下层。在数据链路层,在TLP 包上再串接一些附加信息,这些信息是对方接收TLP 包时进行错误检查要用到的,形成数据链路层包(DLLP——Data Link Layer Package);在物理层,对DLLP 包进行编码,占用链路中的可用通道,从发送器发送出去。
在接收端,实际上是发送端的“逆”过程。如果说发送端是在不断组包,那么接收端就是不断的拆包,最后提取出有用的数据信息供B设备的应用程序使用。
二、PCIe的Config空间与BAR空间
0.总结
把 PCIe 功能理解成一个“插卡设备”:
Config 空间:设备的“身份证 + 控制面板 + 资源申请单”。系统通过它发现设备、识别类型、配置命令、中断、电源,并读取 BAR。
BAR 空间:设备向系统申请的“地址窗口/门牌号”。系统给 BAR 分配一段主机物理地址后,CPU 访问这段地址,就等于访问设备内部的寄存器、FIFO、SRAM、Doorbell 等资源。
1.PCIe Config 空间
PCIe 每个 Function 都有独立的配置空间。传统 PCI 是 256 字节,PCIe 扩展到 4KB:
- 0x000 ~ 0x0FF:PCI 兼容配置空间,前 64 字节是标准头。
- 0x100 ~ 0xFFF:PCIe 扩展配置空间,如 PCIe Capability、AER、SR-IOV 等。
标准头里常见字段:
- Vendor ID、Device ID:厂商和设备 ID。
- Class Code:设备类型,如网卡、NVMe、桥。
- Command、Status:使能 Memory/IO 空间、总线主控、中断等。
- Header Type:普通设备 Type 0,桥 Type 1。
- BAR0 ~ BAR5:基地址寄存器。
- Capabilities Pointer:指向 MSI、MSI-X、PCIe 能力等。
访问方式:
- 传统 x86:通过 IO 端口 0xCF8/0xCFC,只能访问前 256 字节。
- PCIe 推荐:ECAM,通过 MMIO 访问全部 4KB。地址通常是:
ECAM_BASE + (bus << 20) + (dev << 15) + (func << 12) + offset
其中 bus/dev/func 就是 BDF。
Config 空间是标准化的,主要给 BIOS/OS 枚举和驱动管理用。
2.BAR 空间
BAR 寄存器本身位于 Config 空间 的 0x10 ~ 0x24。它描述设备需要的一段地址窗口:
- 是 Memory BAR 还是 I/O BAR;
- 是 32 位还是 64 位地址;
- 是否可预取;
- 需要多大空间;
- 系统分配给它哪个基地址。
一个 Type 0 设备最多 6 个 32 位 BAR;如果是 64 位 BAR,会占用两个连续的 BAR 寄存器。
系统枚举时通常这样做:
1.保存 BAR 原值。
2.向 BAR 写全 1,例如 0xFFFFFFFF。
3.读回 BAR。
4.清除低 4 位属性位,取反加一,得到 BAR 空间大小。
5.分配一段未使用的物理地址。
6.把基地址写回 BAR。
7.设置 Command 寄存器的 Memory Space Enable 或 I/O Space Enable。
例如:
- BAR0 写全 1 后读回 0xFFFF0000,说明大小是 0x10000,即 64KB,且需要 64KB 对齐。
- 系统分配 0xFE000000,写入 BAR0。
- 之后 CPU 访问 0xFE000000 + 0x100,就是访问设备内部偏移 0x100 的寄存器。
BAR 空间的特点是:
- 大小由设备决定,可能几 KB,也可能几百 MB。
- 地址由系统分配,必须对齐。
- 多个 BAR 可以映射不同资源,例如 BAR0 寄存器,BAR1 MSI-X 表,BAR2 队列。
- PCIe 推荐使用 Memory BAR,I/O BAR 已逐渐淘汰。
- 必须使能 Command 中的 Memory/IO Space,设备才会响应 BAR 地址访问。

1万+

被折叠的 条评论
为什么被折叠?



