PCIe从入门到精通
+ -

PCIe 从入门到精通之八:PCIe 设备的身份证 ID

2026-04-02 0 0

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 中的分布:

BDF地址结构

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 空间。

ECAM地址计算

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 查看配置空间》


0 篇笔记 写笔记

关注公众号
取消
感谢您的支持,我会继续努力的!
扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

您的支持,是我们前进的动力!