PCIe配置篇(1)——如何进行配置操作(一)

news2024/12/25 16:28:30

一、功能的唯一标识——BDF

        首先我们简单回顾一下总线(Bus)、设备(Device)、功能(Function)这几个概念:

  • 功能(function):是PCI设备中独立的功能单元,最多可以有8个功能。
  • 设备(device):是物理设备,连接在PCI总线上,可能包含一个或多个功能。
  • 总线(bus):是设备和系统通信的通道,一个系统可以有多个总线,每个总线最多可以有32个设备。

        他们的包含关系是总线上可以挂在多个设备,单个设备最多支持8个功能,而功能(Function)就是我们配置的对象。那在一个PCIe的系统中,就会存在多个功功能,那配置的发起方如何识别正确的功能就是我们面临的第一个问题。因此,每一个功能应该有一个自己的名字(唯一标识)。这个唯一的标识符一般被称为“BDF”。 所谓“BDF”,其实就是 Bus、Device 和 Function的缩写,用来表示这个Function属于哪一条总线,哪一个设备里的哪一个功能。

        在BDF中,Bus Number占用8位,Device Number占用5位,Function Number占用3位。显然,PCIe总线最多支持256个子总线,每个子总线最多支持32个设备,每个设备最多支持8个功能。图 3-1 展示了一个 PCIe 拓扑结构,图中着重标识了示例系统中的Buses、Devices 和 Functions。

        我们来看一下这个命名规则,PCIe总线采用的是一种深度优先(Depth First Search)的拓扑算法,且Bus0总是分配给Root Complex。Root中包含有集成的Endpoint和多个端口(Port),每个端口内部都有一个虚拟的PCI-to-PCI桥(P2P),并且这个桥也应有设备号和功能号。需要注意的是,每个设备必须要有功能0(Fun0),其他的7个功能(Fun1~Fun7)都是可选的。

二、配置地址空间(Configuration Address Space)

        明确了怎么识别需要配置的对象,我们来看一下需要配置的区域是什么样的。

        最早的PC要求用户通过设置开关和跳线来为每个插入的卡分配资源,常常导致内存、I/O和中断设置的冲突。后来引入的扩展ISA(EISA)和IBM PS2系统是最早实现即插即用架构的系统之一。在这些架构中,每个插入卡片都附带配置文件,使系统软件能够分配基本资源。PCI进一步扩展了这一功能,通过实现标准化的配置寄存器,使得通用操作系统能够管理几乎所有系统资源。通过标准化的方式实现错误报告、中断传递、地址映射等功能,一个配置软件实体就可以分配和配置系统资源,从而几乎消除了资源冲突的可能性。

        PCI为每个功能(Function)定义了一块专用的配置地址空间。映射到配置空间的寄存器允许软件发现功能的存在、配置其正常操作并检查其状态。大多数需要标准化的基本功能都在配置寄存器块的头部区域,但PCI架构设计者意识到,标准化一些可选功能(如电源管理、热插拔等)的能力结构(capability structures)将带来更多好处。PCI兼容的配置空间为每个功能分配了256字节的地址空间,用于实现这些功能。

2.1 PCI 兼容空间(PCI-Compatible Space)

        如图 3-2 所示,PCI 兼容的配置空间被命名为256字节,因为它最初是为 PCI 设计的。在这 256 字节的配置空间中,前 16 个双字(即 64 字节)构成了配置头部(Header Type 0 或 Header Type 1)。Type 0 头部是每个功能模块(Function)所必须的,除了桥接功能(bridge functions)使用 Type 1 头部外。其余的 48 个双字(后面的192字节)用于可选寄存器,包括 PCI 功能结构(capability structures)。

        对于 PCIe 功能,一些功能结构是必需的。例如,PCIe 功能必须实现以下功能结构:

  • PCI Express Capability
  • Power Management(电源管理)
  • MSI 、MSI-X

         在这里我们暂时不关注Type 0 和Type 1的区别,我们需要知道的就是对于PCIe来说,其配置空间中前面的256 Bytes是可以和PCI协议兼容,其中的前64 字节构成了配置头部,其主要作用是为操作系统和配置软件提供一个标准化的方式来识别、配置和管理 PCI 或 PCIe 设备(这部分我们后续讨论)。后面的192 Bytes是PCI的capability structures字段,PCIe也需要利用这些字段实现一部分配置。

2.2 扩展配置空间(Extended Configuration Space)

        随着PCIe的引入,原本用于PCI的256字节配置空间不再足够容纳所有新增加的能力结构,因此配置空间的大小从每个功能的256字节扩展到了4KB,这被称为扩展配置空间(Extended Configuration Space)。扩展后的960个双字区域只能通过增强配置机制(Enhanced Configuration Mechanism)访问,因此对于旧的PCI软件是不可见的。

        扩展配置空间包含了PCIe的附加可选扩展能力寄存器(Extended Capability Registers),这些寄存器提供了PCIe功能所需的额外功能。例如,它可能包括高级错误报告(Advanced Error Reporting)、虚拟通道(Virtual Channel)、链路带宽通知(Link Bandwidth Notification)等高级功能,如图3-3中列出的部分功能(注意,这并不是完整列表)。

        这个扩展配置空间允许PCIe设备支持更多的高级功能,同时保持与传统PCI设备的兼容性。因此,操作系统或驱动程序可以通过标准化的方式识别和利用这些扩展功能,进一步增强系统性能和可靠性。

三、配置的发起者

        对于配置来说,有了被配置的对象,还需要有配置操作的发起者,根据规范,只有RC(Root Complex)被允许发起配置请求(Configuration Requests)。RC作为系统处理器的中介,将请求注入PCIe网络中,并将完成的响应返回给处理器。这种配置事务的发起权仅限于通过 RC 由处理器进行,目的是避免设备之间随意修改其他设备配置的混乱局面。

        由于只有 RC 可以发起配置请求,因此这些请求只能沿着系统的下游方向传递,这意味着设备之间的点对点配置请求是不允许的。配置请求通过目标设备的ID进行路由,这个ID由设备在拓扑中的总线号(Bus Number)、设备号(Device Number)和功能号(Function Number, BDF)组成。这种严格的路由机制确保了系统的稳定性和一致性,避免了配置冲突。

四、小结

        至此,我们基本了解了配置操作的主要参与者,被配置的对象是设备中的功能(Function),每个功能(Function)会有一个自己的唯一标识BDF。配置的发起者是总线与系统处理器的中介——RC。需要配置的配置地址空间里可以兼容PCI协议,此外对于PCIe做了一定的拓展。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2194967.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

文心一言 VS 讯飞星火 VS chatgpt (364)-- 算法导论24.3 6题

六、给定有向图 G ( V , E ) G(V,E) G(V,E),每条边 ( u , v ) ∈ E (u,v)∈E (u,v)∈E 有一个关联值 r ( u , v ) r(u,v) r(u,v) ,该关联值是一个实数,其范围为 0 ⩽ r ( u , v ) ⩽ 1 0⩽r(u,v)⩽1 0⩽r(u,v)⩽1 ,其代表的意…

Sleuth、Zipkin学习

系列文章目录 JavaSE基础知识、数据类型学习万年历项目代码逻辑训练习题代码逻辑训练习题方法、数组学习图书管理系统项目面向对象编程:封装、继承、多态学习封装继承多态习题常用类、包装类、异常处理机制学习集合学习IO流、多线程学习仓库管理系统JavaSE项目员工…

去掉最大最小值的部门平均薪水

有员工薪资表t3_salary,包含员工ID(emp_id),部门ID(depart_id),薪水(salary),请计算去除最高最低薪资后的平均薪水;(每个部门员工数不少于3人) CREATE TABLE t3_salary (emp_id bigint,depart_id bigint,salary decima…

使用springCache实现缓存

简介 这个springCache貌似jdk8或者以上才可以 cache最好加在controller层,毕竟返回给前端的数据,在这一步才是最完整的,缓存controller的数据才有意义配置 导入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-bo…

业务封装与映射 -- OTUk/ODUk/OPUk开销帧结构

开销是为了保证净荷正常、灵活传送所必须附加的供网络运行、管理和维护&#xff08;OAM&#xff09;使用的字节。 OTN电层开销包括OTUk开销、ODUk开销、OPUk开销、OTUCn开销、ODUCn开销、OPUCn开销和帧对齐开销。 SM开销属于OTU开销&#xff0c;占用3个字节&#xff1b;PM开销…

【HappyCoding 之前,如何做好需求分析?】

“代码没写完&#xff0c;哪有脸睡觉”&#xff1f;代码爱好者们如是说。在工作当中&#xff0c;开发者往往也要担任需求分析的角色&#xff0c;承担一些需求分析设计文档编写等工作&#xff0c;这对于一些刚入行的新手或是一些自我封闭的“代码高手”来说是比较头疼的&#xf…

用Python Turtle绘制天安门技术讲解

概述 Python的Turtle模块是一个简单的绘图库&#xff0c;它允许用户通过简单的命令控制一个小海龟在屏幕上移动&#xff0c;绘制出各种图形。本文将通过一个具体的示例——绘制简化版的天安门&#xff0c;来详细讲解如何使用Turtle模块。 环境准备 确保你的Python环境中已经…

【CF2021E】Digital Village(All Version)

题目 给你一张 n n n 个点 m m m 条边的无向图&#xff0c;有 p p p 个关键点。你需要选择 k k k 个点染黑&#xff0c;使得这 p p p 个关键点到这 k k k 个黑点的代价和最小。定义代价为两点之间边权最大的边的最小值。 你需要求出 k 1,2,…,n 的所有答案 E1 n,m,p&l…

OBOO鸥柏丨数字化展厅液晶拼接屏联动展馆触摸屏查询一体机信息化

在OBOO鸥柏精心雕琢的多媒体展厅展馆解决方案中&#xff0c;鸥柏液晶拼接屏的多屏联动互动技术犹如一条无形的数字科技纽带&#xff0c;OBOO鸥柏巧妙地将多台商用显示设备编织成一幅幅动态共生的视觉盛宴。鸥柏这项技术&#xff0c;不仅仅是简单的显示设备互联&#xff0c;鸥柏…

73.【C语言】C/C++的内存区域划分

1.内存里的几个区域 除了耳熟能详的栈区,堆区,静态区,还有内核空间,内存映射段,数据段,代码段 2.示意图 3.解释 栈区(stack area):局部变量,函数参数,返回数据,返回地址 内存映射段:将文件映射到内存 映射: 如果看过王爽老师的 《汇编语言 第四版》,其中写到了可以操作B800…

【可答疑】基于51单片机的倒车雷达测距(含仿真、代码、报告、演示视频等)

✨哈喽大家好&#xff0c;这里是每天一杯冰美式oh&#xff0c;985电子本硕&#xff0c;大厂嵌入式在职0.3年&#xff0c;业余时间做做单片机小项目&#xff0c;有需要也可以提供就业指导&#xff08;免费&#xff09;~ &#x1f431;‍&#x1f409;这是51单片机毕业设计100篇…

三、数据链路层(下)

目录 3.6以太网 以太网的分类 Mac地址 以太网数据格式 3.7互联网 数据是如何传输的&#xff1f; 3.8以太网、局域网、互联网的区别 总结&#xff1a; 3.9 vlan基本概念与基本原理 Vlan实现 划分 VLAN 例题 3.10广域网及相关协议 ppp协议 PPP协议所满足的要求 P…

【GitHub】上传文件到GitHub

参考视频&#xff1a;手把手教你在github上传文件_哔哩哔哩_bilibili 1.找到文件夹右键&#xff0c;选择open git bash here 2.完成指令 git initgit add *git commit -m "first commit"3.打开该文件夹&#xff0c;打开隐藏文件.git/config 编辑输入邮箱和GitHub用…

关于Qt音乐播放器进度条拖拽无用的问题解决方案

在使用Qt编写音乐播放器的时候&#xff0c;进度条关联播放音乐基本是必须的。那么在设计的过程中你可能会碰到一个奇怪的问题就是拖拽进度条的时候&#xff0c;可能会报错如下&#xff1a; 然后音乐就卡着不动了。。。 connect(ui->volume_toolButton,&VolumeToolBtn::…

AI大模型,但是在卫星

B站&#xff1a;啥都会一点的研究生公众号&#xff1a;啥都会一点的研究生 AI圈又发生了啥新鲜事&#xff1f; 国星宇航实现全球首次卫星在轨AI大模型技术验证 国星宇航成功完成了全球首次卫星在轨运行AI大模型技术验证&#xff0c;验证了AI大模型在太空中的空间适应性和算力…

解决ERR_PROXY_CONNECTION_FAILED

版权声明 本文原创作者&#xff1a;谷哥的小弟作者博客地址&#xff1a;http://blog.csdn.net/lfdfhl 错误描述 电脑无法正常上网&#xff0c;报错信息如下&#xff1a;ERR_PROXY_CONNECTION_FAILED&#xff1b;图示如下&#xff1a; 解决方案 请按如下步骤和方式解决该问题…

Linux 系统成为隐秘“Perfctl”加密挖矿恶意软件的目标

Aqua Security 的研究人员上周透露&#xff0c;数以千计的 Linux 系统可能感染了极难追踪且持久的“perfctl”&#xff08;或“ perfcc ”&#xff09;加密挖掘恶意软件&#xff0c;许多其他系统仍然面临被入侵的风险。 在观察到的所有攻击中&#xff0c;恶意软件都被用来运行…

C语言入门指南:为大一新生准备

C语言入门指南&#xff1a;为大一新生准备 C语言是许多编程语言的基础&#xff0c;许多现代编程语言&#xff08;如C、Java、Rust等&#xff09;都从C语言中汲取了灵感。因此&#xff0c;学习C语言不仅能帮助你掌握编程的基本概念&#xff0c;还能为学习其他编程语言打下坚实的…

ThinkBook 16+ 锐龙6800h 安装ubuntu键盘失灵

问题&#xff1a;在ThinkBook 16 锐龙6800h 安装ubuntu18.04 出现笔记本键盘按下延迟非常高&#xff0c;输出卡死的情况&#xff0c;但是外接键盘可以正常使用 解决&#xff1a;更新内核 1、进入 https://kernel.ubuntu.com/~kernel-ppa/mainline/ 下载所需内核版本&#x…

Array类、引用类型

前面我们对数组的增加,删除,查找,更改都需要进行循环遍历,非常的麻烦。C#系统为我们提供了Array类,在这个类中定义了许多对数组进行操作的方法,我们可以直接用,从而提高效率。 索引查找: int[] a = { 1, 2, 3, 4, 3 }; int b=Array.IndexOf(a, 3);//第一个参数为数组…