【精讲】PCIe基础篇——BDF与配置空间

 BDF

        PCIe总线中的每一个功能都有一个唯一的标识符与之对应。这个标识符就是BDF(Bus,Device,Function)

BUS:总线号,最多可以通过配置软件分配256个总线号。初始总线号,总线0,通常由硬件分配给Root Complex。总线0由一个集成了端点的虚拟PCI总线和一个硬编码的设备号和功能号的虚拟PCI-to-PCI桥(P2P)组成。每个P2P网桥创建一个新的总线,附加的PCle设备可以连接到该总线。每个总线必须被分配一个唯一的总线号。配置软件通过搜索从总线0、设备0、功能0开始的桥,开始分配总线号,当发现网桥时,软件会给新总线分配一个唯一且大于网桥所在总线号的总线号。一旦新总线被分配了一个总线号,软件就开始在继续扫描当前总线上的更多的桥之前寻找新总线上的桥。这被称为“深度优先搜索”,在后续章节“枚举-发现拓扑”中有详细描述。

Device:设备号,PCle允许在单个PCI总线上最多32个设备号,然而,PCle的点对点特性意味着只有单个设备可以直接连接到PCle链路,并且该设备总是以device 0结束。RC和Switch有虚拟PCI总线,它允许多个设备“连接”到总线上。每个设备必须实现Function 0,并且可能包含多达8个Function 的集合。当包含两个或多个Function时,设备称为多功能设备。

Function:功能号,如前所述,功能被包含到每个Device中。这些功能可能包括硬盘接口、显示控制器、以太网控制器、USB控制器等。具有多个功能的设备不需要按顺序实现。例如,设备可能实现Function0、2和7。因此,当软件检测多功能设备时,必须检查每一个可能的功能,以了解哪些功能是存在的。每个Function也有自己的配置地址空间,用于设置关联的资源。

配置空间

什么是PCIe的配置空间

  每个PCIE设备都有自己的独立的一段配置空间,该部分空间是这个设备的,系统会给这个设备分配一段内存空间,CPU访问这段内存空间即访问对此设备的配置空间。设备在出厂时,配置空间是有默认初始值的。

PCIe设备的配置空间有多大? PCI和PCIe的配置空间有何区别联系?

  早期的PCI时期,系统为每个PCI设备分配的内存大小仅有256个Bytes。到后来的PCIE时期,随着设备性能增强,PCIE设备的配置空间扩展至4K个Bytes。在这里需要注意:PCIE一共支持256条Bus,32个Dev,8个Fun。因此在满负载的情况下,共需内存大小 = 4k * 256 *32*8  = 256M,这个256M的内存空间是为PCIE设备准备的空间系统不可用。如下图所示:

         PCIE设备发展向前兼容PCI,每个设备的配置空间的前256个Byte是PCI空间(PCI Compatible Space),后(4k-256)个Byte的空间是PCIE扩展空间(Extended Configuration Space)。

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

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

### BDF在IT领域的作用及相关技术 #### 什么是BDFBDF(Bus:Device:Function)是一种用于唯一标识PCI Express设备的三元组表示方法。它通过总线号、设备号和功能号来区分不同的硬件组件[^1]。 #### BDF的分配机制 在一个复杂的PCIe拓扑结构中,USP(Upstream Port)需要依赖于整个PCIe树形结构的规划来进行BDF信息的分配,而不是独立完成这一过程。具体来说,每个USP会截取并记录发送到`cfg0wr`请求中的BDF字段作为自己的身份标识,并将其保存以便后续通信使用。 #### TLPBAR空间的关系 传输层包(TLP, Transaction Layer Packet)中的地址字段定义了如何访问特定内存区域或I/O端口。而基址寄存器(BAR, Base Address Register)则用来描述这些资源的具体位置以及大小范围。两者之间存在紧密联系,这种映射关系通常借助地址翻译单元(ATU, Address Translation Unit)实现转换操作[^2]。 #### 实际应用案例——前端交互设计 下面展示了一个简单的HTML按钮控件及其对应的JavaScript逻辑处理函数,当用户点击该按钮时提示确认框询问是否执行某项动作;如果得到肯定答复,则提交表单至指定URL路径完成相应任务: ```html <td align="left"> <input type="button" class="form-buttun" value="数据上报(DBF)" onclick="exportDBF4()"> </td> <script> function exportDBF4(){ if(confirm("确定导出系统数据吗?")){ document.getElementById("form").action="<%=request.getContextPath() %>/bc/dogjsexplore.htm"; document.getElementById("form").submit(); } } </script> ``` 上述代码片段展示了实际项目开发过程中可能涉及到的一种场景:即通过Web界面触发后台服务接口调用从而达到管理维护目的之一部分表现形式而已[^3]。 ---
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

咸鱼弟

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值