PCIe BDF | 设备识别 / Linux 系统设备管理

注:本文为 “PCIe BDF” 相关文章合辑。

图片清晰度受引文原图所限。
略作重排,未整理去重。
如有内容异常,请看原文。


PCIe 中的 BDF:设备定位的关键

在 Peripheral Component Interconnect Express (PCIe) 架构中,BDF (Bus:Device:Function) 是一个三元组,用于唯一标识系统中的每个 PCIe 设备或其功能。理解 BDF 的含义及其在 PCIe 架构中的作用至关重要。

BDF 的组成

BDF 由以下三个部分组成:

  1. Bus Number(总线号)

    • 作用: 用于标识 PCIe 拓扑结构中的总线层级。
    • 取值范围: 通常从 0 开始,Root Complex(根联合体)连接的总线编号为 0。总线号由主机桥分配并贯穿整个 PCIe 域。
    • 说明: 在多层 PCIe 拓扑中,如包含 PCIe Switch(交换机)的系统,不同的 Switch 端口会连接到不同的总线。总线号用于区分这些不同的总线段。
  2. Device Number(设备号)

    • 作用: 用于标识特定总线上的 PCIe 设备。
    • 取值范围: 通常从 0 开始,每个总线上的设备按顺序编号。
    • 说明: 同一条 PCIe 总线上可以连接多个 PCIe 设备。设备号用于区分这些设备。
  3. 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 系统中扮演着关键角色,其应用主要体现在以下几个方面:

  1. 设备枚举与识别: 操作系统在 PCIe 设备枚举过程中,使用 BDF 唯一地标识和定位每个设备,以便进行后续的配置和管理。
  2. 配置空间访问: 系统软件通过 BDF 定位到特定的 PCIe 设备,然后访问其配置空间,读取或修改配置寄存器,从而完成设备的初始化和配置。
  3. 事务路由: 在 PCIe 事务处理中,BDF 用于标识数据包的目标设备和功能。 PCIe 事务层使用 BDF 来构建 TLPs (Transaction Layer Packets),确保数据能够正确路由到目标设备。

示例场景

考虑一个包含以下 PCIe 设备的系统:

  • Root Complex (根联合体): 00:00.0
  • 网络接口卡 (NIC): 00:01.0
  • 固态硬盘 (SSD): 00:02.0
  • 多功能网卡 (包含网络和存储功能): 00:03.000: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 发布

PCIe 图解

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 配置空间示意图

PCIe 设备向前兼容 PCI,每个设备的配置空间的前 256 个字节是 PCI 空间(PCI Compatible Space),后(4K - 256)个字节的空间是 PCIe 扩展空间(Extended Configuration Space)。

PCIe 配置空间有两种类型的 Header Type(Type0 和 Type1)。

PCIe 配置空间 Header Type

如上图所示,配置空间前 64 字节是 Header Space,有两种类型:Type0 和 Type1。这是因为 PCIe 设备分为 Bridge 和 Agent 两种类型。Agent 的配置空间类型称为 Type 0 类型,Bridge 的配置空间类型称为 Type1 类型。两种头所在的设备如下图所示:

PCIe 设备类型示意图


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)总线拓扑:

  1. 使用 lspci 命令

    lspci -t
    

    该命令以树形结构列出 PCIe 总线及其连接的设备和桥接器信息。

  2. 使用 lspcigrep 命令

    lspci -vv | grep "^\([0-9a-f]\{2\}:\)\{2\}[0-9a-f]\{2\}"
    

    该命令将以详细格式输出 lspci 信息,并查找所有 PCIe 设备的详细信息。

  3. 使用 lshw 命令

    sudo lshw -class bridge -businfo
    

    该命令列出 PCIe 桥接器及其子设备的详细信息,并以总线信息的形式输出。

  4. 使用 hwloc 工具

    hwloc-ls --whole-system
    

    该工具将显示整个系统的硬件拓扑结构,包括 PCIe 拓扑。


via:

内容概要:本文详细介绍了使用KGDB(Kernel GNU Debugger)调试Linux内核的方法及其重要性。文章首先强调了Linux内核作为系统核心的重要性及其调试的必要性,随后介绍了KGDB的基本原理和优势,包括其基于调试stub和GDB串行协议的工作机制。接着,文章详细描述了使用KGDB调试内核的具体步骤,包括准备工作、内核配置、设置启动参数、建立调试连接和进行调试操作。文中还通过一个实战案例展示了KGDB在解决实际问题中的应用,并总结了使用KGDB时的注意事项和常见问题的解决方法。最后,文章展望了KGDB未来的发展方向和应用场景,如优化调试性能、支持新型硬件架构以及在嵌入式系统、云计算和大数据领域的应用。 适合人群:具备一定Linux系统开发经验的研发人员,尤其是那些需要调试和优化Linux内核的工程师。 使用场景及目标:①帮助开发者深入了解Linux内核的运行状态,精准定位并修复内核问题;②优化内核性能,提高系统的稳定性和可靠性;③适用于嵌入式系统开发、远程服务器维护等场景,特别是在硬件资源有限或无法直接接触设备的情况下。 其他说明:在使用KGDB进行调试时,需特别注意串口设置的一致性、内核版本的兼容性以及调试信息的完整性。同时,要解决常见的连接失败、断点无效等问题,确保调试过程顺利进行。未来,KGDB有望在技术上不断优化,并拓展到更多应用场景中,为Linux系统的持续发展提供支持。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值