注:本文为 “PCIe BDF” 相关文章合辑。
图片清晰度受引文原图所限。
略作重排,未整理去重。
如有内容异常,请看原文。
PCIe 中的 BDF:设备定位的关键
在 Peripheral Component Interconnect Express (PCIe) 架构中,BDF (Bus:Device:Function) 是一个三元组,用于唯一标识系统中的每个 PCIe 设备或其功能。理解 BDF 的含义及其在 PCIe 架构中的作用至关重要。
BDF 的组成
BDF 由以下三个部分组成:
-
Bus Number(总线号)
- 作用: 用于标识 PCIe 拓扑结构中的总线层级。
- 取值范围: 通常从 0 开始,Root Complex(根联合体)连接的总线编号为 0。总线号由主机桥分配并贯穿整个 PCIe 域。
- 说明: 在多层 PCIe 拓扑中,如包含 PCIe Switch(交换机)的系统,不同的 Switch 端口会连接到不同的总线。总线号用于区分这些不同的总线段。
-
Device Number(设备号)
- 作用: 用于标识特定总线上的 PCIe 设备。
- 取值范围: 通常从 0 开始,每个总线上的设备按顺序编号。
- 说明: 同一条 PCIe 总线上可以连接多个 PCIe 设备。设备号用于区分这些设备。
-
Function Number(功能号)
- 作用: 用于标识 PCIe 设备中的独立功能单元。
- 取值范围: 通常从 0 开始,一个设备最多可以有 8 个功能 (0-7)。
- 说明: 某些 PCIe 设备可以实现多个功能,例如集成了网络和存储接口的网卡。功能号用于区分设备内部的各个功能单元。
一个物理 PCIe 设备可以作为一个单一逻辑功能设备存在(Function 0),也可以作为一个多功能设备存在(多个 Function)。
BDF 的表示
BDF 通常采用 B:D:F
的格式表示,例如 00:01.0
,其含义如下:
B
: Bus Number (总线号)D
: Device Number (设备号)F
: Function Number (功能号)
例如,00:01.0
表示:
- 总线号为 00(通常是根联合体连接的总线)。
- 设备号为 01。
- 功能号为 0。
BDF 的应用
BDF 在 PCIe 系统中扮演着关键角色,其应用主要体现在以下几个方面:
- 设备枚举与识别: 操作系统在 PCIe 设备枚举过程中,使用 BDF 唯一地标识和定位每个设备,以便进行后续的配置和管理。
- 配置空间访问: 系统软件通过 BDF 定位到特定的 PCIe 设备,然后访问其配置空间,读取或修改配置寄存器,从而完成设备的初始化和配置。
- 事务路由: 在 PCIe 事务处理中,BDF 用于标识数据包的目标设备和功能。 PCIe 事务层使用 BDF 来构建 TLPs (Transaction Layer Packets),确保数据能够正确路由到目标设备。
示例场景
考虑一个包含以下 PCIe 设备的系统:
- Root Complex (根联合体):
00:00.0
- 网络接口卡 (NIC):
00:01.0
- 固态硬盘 (SSD):
00:02.0
- 多功能网卡 (包含网络和存储功能):
00:03.0
和00:03.1
在这个例子中,通过 BDF,操作系统可以清晰地区分和管理每一个设备及其功能单元,实现对整个 PCIe 系统的有效控制。
通过理解 BDF 的构成、作用以及在 PCIe 架构中的应用,可以更好地理解 PCIe 设备的识别、配置和通信机制。
查看 PCIe 设备 BDF 和设备名称对应关系
leoufung 于 2018-06-06 15:39:45 发布
如何查看 PCIe 设备 BDF 和设备名称的对应关系,可以使用 lshw
命令。
[root@vm1 pdcp_src]# lshw -c network -businfo
Bus info Device Class Description
============ =========== ========= ============
pci@0000:00:03.0 network Virtio network device
virtio@0 eth0 network Ethernet interface
pci@0000:00:0a.0 network XL710/X710 Virtual Function
pci@0000:00:0a.1 network XL710/X710 Virtual Function
PCIe 基础篇 ——BDF 与配置空间
咸鱼弟于 2021-07-31 11:55:37 发布
BDF
PCIe 总线中的每一个功能都有一个唯一的标识符与之对应,即 BDF(Bus,Device,Function)。
-
BUS:总线号,最多可通过配置软件分配 256 个总线号。初始总线号为总线 0,通常由硬件分配给 Root Complex。总线 0 由一个集成了端点的虚拟 PCI 总线和一个硬编码的设备号与功能号的虚拟 PCI-to-PCI 桥 (P2P) 组成。每个 P2P 网桥创建一个新的总线,附加的 PCIe 设备可以连接到该总线。每个总线必须被分配一个唯一的总线号。配置软件通过从总线 0、设备 0、功能 0 开始搜索桥,开始分配总线号。当发现网桥时,软件会给新总线分配一个唯一且大于网桥所在总线号的总线号。一旦新总线被分配了一个总线号,软件会继续在扫描当前总线上的更多桥之前,寻找新总线上的桥。这一过程被称为“深度优先搜索”,在后续章节“枚举 - 发现拓扑”中有详细描述。
-
Device:设备号,PCIe 允许在单个 PCI 总线上最多有 32 个设备号。然而,PCIe 的点对点特性意味着只有单个设备可以直接连接到 PCIe 链路,并且该设备总是以 device 0 结束。Root Complex 和 Switch 有虚拟 PCI 总线,允许多个设备“连接”到总线上。每个设备必须实现 Function 0,并且可能包含多达 8 个 Function 的集合。当包含两个或多个 Function 时,设备称为多功能设备。
-
Function:功能号,如前所述,功能被包含到每个 Device 中。这些功能可能包括硬盘接口、显示控制器、以太网控制器、USB 控制器等。具有多个功能的设备不需要按顺序实现。例如,设备可能实现 Function 0、2 和 7。因此,当软件检测多功能设备时,必须检查每一个可能的功能,以了解哪些功能是存在的。每个 Function 也有自己的配置地址空间,用于设置关联的资源。
配置空间
什么是 PCIe 的配置空间?
每个 PCIe 设备都有自己的独立配置空间,系统会为该设备分配一段内存空间。CPU 访问这段内存空间即为访问该设备的配置空间。设备在出厂时,配置空间具有默认初始值。
PCIe 设备的配置空间有多大?PCI 和 PCIe 的配置空间有何区别与联系?
在早期的 PCI 时期,系统为每个 PCI 设备分配的内存大小仅有 256 个字节。到后来的 PCIe 时期,随着设备性能的增强,PCIe 设备的配置空间扩展至 4K 个字节。需要注意的是,PCIe 一共支持 256 条 Bus、32 个 Dev 和 8 个 Fun。因此,在满负载的情况下,所需内存大小 = 4K × 256 × 32 × 8 = 256M。这 256M 的内存空间是为 PCIe 设备准备的,系统不可用。
PCIe 设备向前兼容 PCI,每个设备的配置空间的前 256 个字节是 PCI 空间(PCI Compatible Space),后(4K - 256)个字节的空间是 PCIe 扩展空间(Extended Configuration Space)。
PCIe 配置空间有两种类型的 Header Type(Type0 和 Type1)。
如上图所示,配置空间前 64 字节是 Header Space,有两种类型:Type0 和 Type1。这是因为 PCIe 设备分为 Bridge 和 Agent 两种类型。Agent 的配置空间类型称为 Type 0 类型,Bridge 的配置空间类型称为 Type1 类型。两种头所在的设备如下图所示:
PCIe 的 BDF 详细介绍及用法实例、Linux 查看 PCI 设备信息命令详解
二进制 coder 于 2023-05-08 22:30:00 发布
PCIe 是一种计算机总线标准。在 PCIe 中,每个连接到主板上的设备都有唯一的地址,称为 BDF。
- BDF:Bus、Device、Function 的缩写。其中,Bus 是指 PCIe 总线编号(一个系统中可能存在多个 PCIe 总线),Device 是指连接到该总线上的某个设备编号,Function 是指同一个设备上不同功能的编号。
- Root 表示开头、根部的意思。因此,Root BDF 是指 PCIe 层次结构中最高层的设备(通常是主板)的 BDF 地址。
在 PCIe 设备 ID 和驱动程序匹配过程中,使用 Root BDF 和设备的 BDF 地址来确认特定设备的位置和身份。PCIe BDF 是用于唯一识别 PCIe 设备的标志符。BDF 表示总线编号、设备编号和功能编号。这三个数字结合在一起,可以标识一个具体的 PCIe 设备。
- 总线编号:表示 PCIe 设备所连接到的 PCIe 根端点所在的物理总线编号。这个编号是唯一的,它与系统中所有其他 PCIe 总线的编号都不同。
- 设备编号:表示物理总线上被分配给 PCIe 设备的编号。这个编号是唯一的,它与同一总线上的其他设备的编号都不同。
- 功能编号:表示在同一 PCIe 设备内部,每个功能被分配的编号。对于只有一个功能的设备,这个值通常为 0。而对于包含多个功能的设备,每个功能都被分配一个唯一的编号。
BDF 的典型格式为 BBBB:DD:FF
。其中,“BBBB” 是四位十六进制的总线编号,“DD” 是两位十六进制的设备编号,“FF” 是两位十六进制的功能编号。例如,一个名为“0000:03:00.0”的 PCIe BDF 号码,表示这个 PCIe 设备连接到物理总线 0000 上,它的设备编号为 03,它只有一个功能,其功能编号为 0。
在 Linux 系统中,可以使用以下工具来查看 PCI Express(PCIe)总线拓扑:
-
使用
lspci
命令lspci -t
该命令以树形结构列出 PCIe 总线及其连接的设备和桥接器信息。
-
使用
lspci
和grep
命令lspci -vv | grep "^\([0-9a-f]\{2\}:\)\{2\}[0-9a-f]\{2\}"
该命令将以详细格式输出
lspci
信息,并查找所有 PCIe 设备的详细信息。 -
使用
lshw
命令sudo lshw -class bridge -businfo
该命令列出 PCIe 桥接器及其子设备的详细信息,并以总线信息的形式输出。
-
使用
hwloc
工具hwloc-ls --whole-system
该工具将显示整个系统的硬件拓扑结构,包括 PCIe 拓扑。
via:
-
查看 PCI-E 设备 BDF 和设备名称对应关系_pcie bdf 号查询 - CSDN 博客
https://blog.csdn.net/leoufung/article/details/80595880 -
【精讲】PCIe 基础篇 ——BDF 与配置空间_pcie bdf-CSDN 博客
https://blog.csdn.net/u013253075/article/details/119218186 -
pcie 的 bdf 详细介绍,及用法实例、linux 查看 pci 设备信息命令详解_pcie bdf-CSDN 博客
https://blog.csdn.net/qq_37037348/article/details/130564019