PCIe从入门到精通之八:PCIe设备的身份证ID
1赞0,引言
在上一篇文章《PCIe从入门到精通之七:PCIe设备的配置空间简介》中,我们介绍了PCIe设备的配置空间的结构。在这一篇文章中我们继续介绍PCIe设备的身份证ID(Bus No, Device No, Function No)。
所有PCIe主题的文章都会收录在《深入浅出聊PCIe》合集里,欢迎评阅。
需要下载PCIe学习资料标准的朋友(pdf格式),请关注本微信公众号“硬件工程师宝典”,在对话框内回复“PCIe”,将获取标准下载链接。
一,PCIe设备的身份证
每个人都有一个身份证ID,通过这个唯一的身份证ID,我们可以识别他是谁、他叫什么名字、他的所有在系统里的信息。
上一章我们说到,所有的PCIe设备都有配置空间,它们的配置空间都被map到flat memory空间里面。这么多PCIe设备的配置空间都存在memory,那么我们是如何找到具体的一个PCIe设备它在memory的空间里的位置?
PCIe设备也有一个身份证,通过这个身份证,我们可以轻而易举地找到它们。
PCIe 设备ID(通常称为 BDF,即 Bus-Device-Function)是PCIe架构中用于唯一标识系统中每个PCIe设备(或其上的特定功能)的逻辑地址。操作系统和驱动程序使用BDF来发现、配置和管理PCIe设备。
二,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中的分布。

三,总线号 (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实现而异):
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)。
四,设备号 (Device Number / Device ID)
定义: 设备号用于标识连接到特定PCIe总线上的一个独立的PCIe设备。
范围: 5位,范围从0到31。这意味着每条PCIe总线上最多可以连接32个设备,如上如所示。
分配:
设备号通常是根据设备在总线上的物理位置或连接顺序(lane number)来分配的。
对于集成在主板上的设备(如集成网卡、USB控制器),它们也会被分配一个设备号。
重要性: 设备号与总线号结合,可以唯一地标识总线上的一个物理设备。
五. 功能号 (Function Number / Function ID)
定义: 功能号用于标识一个PCIe设备内部的特定功能。一个物理PCIe设备可以包含一个或多个独立的功能。
范围: 3位,范围从0到7。这意味着一个物理设备最多可以包含8个独立的功能,如上如所示。
多功能设备:
单功能设备: 大多数PCIe设备是单功能设备,只实现一个功能(Function 0)。例如,一块独立的网卡通常只有一个功能。
多功能设备: 某些设备为了节省空间或提供集成服务,会将多个功能集成在一个物理芯片或板卡上。例如:
一个集成声卡和网卡的芯片可能分别对应Function 0和Function 1。
一个复杂的存储控制器可能包含多个独立的控制器或端口,每个都作为一个功能。
USB控制器通常是多功能设备,一个物理设备可能包含多个USB主机控制器(如XHCI、EHCI、OHCI等),每个都是一个独立的功能。
重要性: 功能号允许系统对一个物理设备内部的不同功能进行独立管理和配置,即使它们共享同一个物理连接。
六. BDF 的组合与应用
BDF地址通常以 BB:DD.F 的格式表示,其中 BB 是总线号(十六进制),DD 是设备号(十六进制),F 是功能号(十六进制)。
示例:
00:02.0: 表示总线0上的设备2的第一个功能。这通常是CPU集成的图形控制器。
01:00.0: 表示总线1上的设备0的第一个功能。这可能是一个插入到PCIe插槽中的独立显卡。
03:00.1: 表示总线3上的设备0的第二个功能。这可能是一个多功能网卡的第二个端口。
七,占用多少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 x 8 functions/device x 32 devices/bus x 256 buses/system = 256MB
公共占用256MB的memory空间。

九, 抛砖引玉
在《PCIe从入门到精通之七》我们已经大体上介绍PCIe设备的配置空间,在PCIe从入门到精通之八》PCIe设备的身份证ID。那么,有什么命令可以将PCIe设备的配置空间读出?将PCIe设备的配置空间读出后它们是什么样子的?
敬请关注下一篇:《PCIe从入门到精通之九:利用lspci和PCIe设备的ID查看配置空间》
十,参考文献:
需要以下参考文献(PCIe标准)的朋友,请关注本微信公众号“硬件工程师宝典”,在对话框内回复“PCIe”,将获取标准下载链接。

百度网盘分享的文件
