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

一、功能的唯一标识——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.mfbz.cn/a/887981.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【GitHub】上传文件到GitHub

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

OpenJudge | 置换选择排序

总时间限制: 1000ms 内存限制: 65536kB 描述 给定初始整数顺串,以及大小固定并且初始元素已知的二叉最小堆(为完全二叉树或类似完全二叉树,且父元素键值总小于等于任何一个子结点的键值),要求利用堆实现置换选择排序&a…

【C++】--类和对象(2)

👌个人主页: 起名字真南 👆个人专栏:【数据结构初阶】 【C语言】 【C】 目录 1 类的默认成员函数2 构造函数3 析构函数4 拷贝构造5 赋值运算符重载5.1 运算符重载5.2 赋值运算符的重载 1 类的默认成员函数 默认成员函数就是用户没有显示实现,…

【Kubernetes】常见面试题汇总(五十三)

目录 118. pod 状态为 ErrlmagePull ? 119.探测存活 pod 状态为 CrashLoopBackOff ? 特别说明: 题目 1-68 属于【Kubernetes】的常规概念题,即 “ 汇总(一)~(二十二)” 。…

Bloom Filter 布隆过滤器

目录 简介 Bloom Filter的基本原理 实现 使用 HashFunc越多,性能越好吗? 如何尽量避免误判? 应用 布隆过滤器优点 简介 Bloom Filter是一种空间效率极高的概率数据结构,它用于测试一个元素是否属于集合。Bloom Filter的优…

【NoSQL】portswigger NoSQL注入 labs 全解

目录 NoSQL NoSQL 数据库模型 NoSQL 注入的类型 NoSQL 语法注入 检测 MongoDB 中的语法注入 lab1:检测 NoSQL 注入 NoSQL 运算符注入 提交查询运算符 检测 MongoDB 中的运算符注入 lab2:利用 NoSQL 运算符注入绕过身份验证 利用语法注入来提取数据 MongoDB 中的数据…

【rust/egui/android】在android中使用egui库

文章目录 说在前面AndroidStudio安装编译安装运行问题 说在前面 操作系统:windows11java版本:23android sdk版本:35android ndk版本:22rust版本: AndroidStudio安装 安装AndroidStudio是为了安装sdk、ndk,…

大数据实时数仓Hologres(三):存储格式介绍

文章目录 存储格式介绍 一、格式 二、使用建议 三、技术原理 1、列存 2、行存 3、行列共存 四、使用示例 存储格式介绍 一、格式 在Hologres中支持行存、列存和行列共存三种存储格式,不同的存储格式适用于不同的场景。在建表时通过设置orientation属性指定表的存储…

【重学 MySQL】五十三、MySQL数据类型概述和字符集设置

【重学 MySQL】五十三、MySQL数据类型概述和字符集设置 MySQL数据类型概述MySQL字符集设置注意事项 MySQL数据类型概述 MySQL是一个流行的关系型数据库管理系统,它支持多种数据类型,以满足不同数据处理和存储的需求。理解并正确使用这些数据类型对于提高…

Linux性能调优技巧

目录 前言1. CPU性能优化1.1 调整CPU调度策略1.2 合理分配多核处理 2. 内存性能优化2.1 调整内存分配策略2.2 缓存和分页优化 3. 磁盘I/O性能优化3.1 使用合适的I/O调度器3.2 磁盘分区和文件系统优化 4. 网络性能优化4.1 优化网络参数4.2 调整网络拥塞控制算法 5. 系统监控与优…

【机器学习】网络安全——异常检测与入侵防御系统

我的主页:2的n次方_ 随着全球互联网和数字基础设施的不断扩展,网络攻击的数量和复杂性都在显著增加。从传统的病毒和蠕虫攻击到现代复杂的高级持续性威胁(APT),网络攻击呈现出更加智能化和隐蔽化的趋势。面对这样的…

Kotlin 处理字符串和正则表达式(二十一)

导读大纲 1.1 处理字符串和正则表达式1.1.1 分割字符串1.1.2 正则表达式和三引号字符串1.1.3 多行三引号字符串IntelliJ IDEA 和 Android Studio 中三重引号字符串内部的语法高亮显示 1.1 处理字符串和正则表达式 Kotlin 字符串与 Java 字符串完全相同 可以将 Kotlin 代码中创建…

Python_文件处理

一个完整的程序一般都包括数据的存储和读取;我们在前面写的程序数据都没有进行实际的存储,因此python解释器执行完数据就消失了。实际开发中,我们经常需要从外部存储介质(硬盘、光盘、U盘等)读取数据,或者将…

查缺补漏----IP通信过程

1.DHCP协议 H3刚接入网络时,只知道自己的MAC地址,所以需要通过DHCP协议请求自己的IP地址。 通过DHCP协议,得到IP地址、子网掩码、网关与DNS服务器IP地址。 DHCP协议是应用层协议(传输层为UDP),请求报文是广播(H3不知…

‌在Python中,print(f‘‘)是什么?

‌在Python中,print(f’)表示使用f-string对字符串进行格式化输出。‌ f-string是Python 3.6及以上版本引入的一种新的字符串格式化机制,它允许在字符串中直接嵌入表达式,这些表达式在运行时会被其值所替换。使用f-string可以更方便地将变量的…

国庆节快乐前端(HTML+CSS+JavaScript+BootStrap.min.css)

一、效果展示 二、制作缘由 最近,到了国庆节,自己呆在学校当守校人,太无聊了,顺便做一个小demo帮祖国目前庆生!!! 三、项目目录结构 四、准备工作 (1)新建好对应的文件目录 为了方便&#xff…

PHP泛目录生成源码,可生成长尾关键词页面,带使用方法视频教程

介绍: 真正的好东西,搞网站优化seo从业必备。可以快速提升网站权重,带来的流量哗哗的 PHP泛目录生成源码 可生成新闻页面和关键词页面 带使用方法视频教程 泛目录可以用来提升网站收录和排名 合理运用目录可以达到快速出词和出权重的效果…

【Bug】解决 Ubuntu 中 “error: Unable to Find Python3 Executable” 错误

解决 Ubuntu 中 “Unable to Find Python3 Executable” 错误 在 Ubuntu 系统上使用 Python 进行开发时,遇到找不到 python3 可执行文件的错误。 主要问题是无法正常打开终端(原生与terminator),找不到python3,且无法…

教育技术革新:SpringBoot在线教育系统开发指南

6系统测试 6.1概念和意义 测试的定义:程序测试是为了发现错误而执行程序的过程。测试(Testing)的任务与目的可以描述为: 目的:发现程序的错误; 任务:通过在计算机上执行程序,暴露程序中潜在的错误。 另一个…

20240930编译orangepi5的Android12使用HDMI0输出

20240930编译orangepi5的Android12使用HDMI0输出 2024/9/30 9:44 缘起,3月份的时候,看PDD拼多多的优惠券给力! 就入手了香橙派Orange Pi 5。 自从制作TF卡的启动卡的时候,坏了一张SanDisk的32GB的TF卡。 从此就对TF卡启动无比抵触…