PCIe 从入门到精通之八:PCIe 设备的身份证 ID
0. 引言
在上一篇文章《PCIe 从入门到精通之七:PCIe 设备的配置空间简介》中,我们介绍了 PCIe 设备的配置空间的结构。在这一篇文章中我们继续介绍 PCIe 设备的身份证 ID(Bus No、Device No、Function No)。
所有 PCIe 主题的文章都会收录在《深入浅出聊 PCIe》合集里,欢迎评阅。
需要下载 PCIe 学习资料标准的朋友(pdf 格式),请关注本微信公众号“硬件工程师宝典”,在对话框内回复“PCIe”,将获取标准下载链接。
1. PCIe 设备的身份证
每个人都有一个身份证 ID,通过这个唯一的身份证 ID,我们可以识别他是谁、他叫什么名字、他的所有在系统里的信息。
上一章我们说到,所有的 PCIe 设备都有配置空间,它们的配置空间都被 map 到 flat memory 空间里面。这么多 PCIe 设备的配置空间都存在 memory,那么我们是如何找到具体的一个 PCIe 设备它在 memory 的空间里的位置?
PCIe 设备也有一个身份证,通过这个身份证,我们可以轻而易举地找到它们。
PCIe 设备 ID(通常称为 BDF,即 Bus-Device-Function)是 PCIe 架构中用于唯一标识系统中每个 PCIe 设备(或其上的特定功能)的逻辑地址。操作系统和驱动程序使用 BDF 来发现、配置和管理 PCIe 设备。
2. BDF 的构成与作用
BDF 由三个部分组成:
| 组成部分 | 名称 |
|---|---|
| Bus Number | 总线号 |
| Device Number | 设备号 |
| Function Number | 功能号 |
它们共同形成了一个 24 位的地址,用于在 PCIe 拓扑结构中精确定位一个特定的 function。
作用
- 唯一标识:系统中的每个 PCIe function 都有一个唯一的 BDF 地址
- 配置访问:操作系统通过 BDF 来访问设备的配置空间(Configuration Space),以读取设备信息或写入配置参数
- TLP 路由:在 PCIe 事务层数据包(TLP)中,BDF 用于 ID-based 路由,确保数据包能够被正确地发送到目标设备
- 资源分配:操作系统根据 BDF 来为设备分配内存、I/O 和中断资源
下图是 Bus Number、Device Number 和 Function Number 在 ECAM address 中的分布:

| Memory Address 位 | PCI Express 配置空间对应字段 |
|---|---|
| A[(20+n-1):20] | Bus Number (1 ≤ n ≤ 8) |
| A[19:15] | Device Number |
| A[14:12] | Function Number |
| A[11:8] | Extended Register Number |
| A[7:2] | Register Number |
| A[1:0] | 与访问大小一起用于生成字节使能 |
3. 总线号(Bus Number / Bus ID)
| 属性 | 说明 |
|---|---|
| 定义 | 标识 PCIe 拓扑结构中的一个逻辑总线段 |
| 范围 | 8 位,范围从 0 到 255 |
| 分配 |
分配规则
- 0 号总线:总是分配给 Root Complex(根联合体)所连接的主 PCIe 总线。Root Complex 是 PCIe 层次结构的起点,通常是 CPU 的一部分或芯片组的一部分
- 枚举过程:当系统启动时,BIOS/UEFI 或操作系统会执行一个称为“总线枚举”(Bus Enumeration)的过程。系统会遍历整个 PCIe 拓扑结构(包括 Root Complex、PCIe Switch 交换机和 PCIe Endpoint 终端设备),并为每个 PCIe 总线段分配一个唯一的总线号
- PCIe 交换机:PCIe 交换机(Switch)扮演着桥接器的角色,它有一个上游端口(连接到上级总线)和多个下游端口(连接到下级总线)。每个下游端口都会引出一个新的 PCIe 总线段,并被分配一个独特的总线号。例如,如果一个交换机连接到总线 0,它的下游端口可能引出总线 1、总线 2 等
重要性
总线号是 PCIe 拓扑结构的基础,它定义了设备之间的层次关系和数据流路径。
举例:一个 4x CPU 的系统
BIOS/UEFI 可能会为每个 CPU 的 Root Complex 分配如下的总线号范围(这只是一个示例,实际分配可能因主板设计和 BIOS 实现而异):
| CPU | 总线号范围 |
|---|---|
| CPU0 的 Root Complex | 0x00 - 0x3F(0 到 63) |
| CPU1 的 Root Complex | 0x40 - 0x7F(64 到 127) |
| CPU2 的 Root Complex | 0x80 - 0xBF(128 到 191) |
| CPU3 的 Root Complex | 0xC0 - 0xFF(192 到 255) |
4. 设备号(Device Number / Device ID)
| 属性 | 说明 |
|---|---|
| 定义 | 标识连接到特定 PCIe 总线上的一个独立的 PCIe 设备 |
| 范围 | 5 位,范围从 0 到 31。这意味着每条 PCIe 总线上最多可以连接 32 个设备 |
| 分配 | 设备号通常是根据设备在总线上的物理位置或连接顺序(lane number)来分配的。对于集成在主板上的设备(如集成网卡、USB 控制器),它们也会被分配一个设备号 |
| 重要性 | 设备号与总线号结合,可以唯一地标识总线上的一个物理设备 |
5. 功能号(Function Number / Function ID)
| 属性 | 说明 |
|---|---|
| 定义 | 标识一个 PCIe 设备内部的特定功能。一个物理 PCIe 设备可以包含一个或多个独立的功能 |
| 范围 | 3 位,范围从 0 到 7。这意味着一个物理设备最多可以包含 8 个独立的功能 |
多功能设备
- 单功能设备:大多数 PCIe 设备是单功能设备,只实现一个功能(Function 0)。例如,一块独立的网卡通常只有一个功能
- 多功能设备:某些设备为了节省空间或提供集成服务,会将多个功能集成在一个物理芯片或板卡上。例如:
- 一个集成声卡和网卡的芯片可能分别对应 Function 0 和 Function 1
- 一个复杂的存储控制器可能包含多个独立的控制器或端口,每个都作为一个功能
- USB 控制器通常是多功能设备,一个物理设备可能包含多个 USB 主机控制器(如 XHCI、EHCI、OHCI 等),每个都是一个独立的功能
重要性
功能号允许系统对一个物理设备内部的不同功能进行独立管理和配置,即使它们共享同一个物理连接。
6. BDF 的组合与应用
BDF 地址通常以 BB:DD.F 的格式表示,其中:
- BB:总线号(十六进制)
- DD:设备号(十六进制)
- F:功能号(十六进制)
示例
| BDF 地址 | 说明 |
|---|---|
00:02.0 |
总线 0 上的设备 2 的第一个功能。这通常是 CPU 集成的图形控制器 |
01:00.0 |
总线 1 上的设备 0 的第一个功能。这可能是一个插入到 PCIe 插槽中的独立显卡 |
03:00.1 |
总线 3 上的设备 0 的第二个功能。这可能是一个多功能网卡的第二个端口 |
7. 占用多少 memory 空间
这么多 PCIe device,每个有 4KB 的 configuration space,那么它们总共要占用多少 memory 空间呢?我们来算一下:
每个 PCIe 体系总线系统最多支持:
- 256 个子总线(8 位 Bus Number)
- 每条 PCI 总线最多 32 个设备(5 位 Device Number)
- 每个 PCI 设备最多 8 种功能(3 位 Function Number)
总的最大可能 size 为:
4K Bytes/function × 8 functions/device × 32 devices/bus × 256 buses/system = 256 MB
总共占用 256 MB 的 memory 空间。

| Memory Address 位 | PCI Express 配置空间对应字段 |
|---|---|
| A[(20+n-1):20] | Bus Number (1 ≤ n ≤ 8) |
| A[19:15] | Device Number |
| A[14:12] | Function Number |
| A[11:8] | Extended Register Number |
| A[7:2] | Register Number |
| A[1:0] | 与访问大小一起用于生成字节使能 |
8. 应用场景总结
| 场景 | 说明 |
|---|---|
| 操作系统对设备的识别和管理 | lspci 命令在 Linux 下会显示设备的 BDF 地址 |
| 驱动程序加载 | 驱动程序会根据设备的 BDF 地址来绑定并控制特定的硬件功能 |
| ECAM(Enhanced Configuration Access Mechanism) | 在 ECAM 机制中,BDF 是计算配置空间内存映射地址的关键组成部分 |
| TLP 路由 | 在 PCIe 的 ID-based 路由中,TLP 头部包含目标设备的 BDF,交换机根据这个 BDF 将 TLP 转发到正确的下游端口或上游端口 |
9. 抛砖引玉
在《PCIe 从入门到精通之七》我们已经大体上介绍 PCIe 设备的配置空间,在《PCIe 从入门到精通之八》介绍了 PCIe 设备的身份证 ID。
那么:
- 有什么命令可以将 PCIe 设备的配置空间读出?
- 将 PCIe 设备的配置空间读出后它们是什么样子的?
敬请关注下一篇:
《PCIe 从入门到精通之九:利用 lspci 和 PCIe 设备的 ID 查看配置空间》
PCIe从入门到精通





