PCIe协议之RCB、MPS、MRRS详解
✨前言:
PCIe总线的存储器写请求、存储器读完成等TLP中含有数据负载,即Data Payload。Data Payload的长度和MPS(Max Payload Size)、MRRS(Max Read Request Size)和RCB(Read Completion Boundary)相关。
✨一、RCB介绍
🌟1.1 什么是RCB?
RCB(Read Completion Boundary)是PCI Express(PCIe)总线中定义的一个参数,它指定了在完成PCIe内存读取请求时可以返回的数据包的最大对齐字节边界。RCB的值通常可配置为64字节或128字节。
这个参数的作用是确保读取响应(Completion)数据包中包含的数据不会跨过特定的对齐边界。简而言之,RCB定义了数据包中的数据应该如何在一个或多个连续的PCIe包中被分割传输,以便于数据的处理和高效率的内存访问。
RCB的设置在系统性能优化中很重要,因为它影响着数据在PCIe接口上传输的效率。合适的RCB设置可以帮助减少延迟和提升带宽的利用率,从而提高整个系统的性能
🌟1.2 RCB配置
在PCIe规范中,RCB主要有两个可选的大小:64字节和128字节。**RC 的 RCB 可以为 64B 或 128B,默认 64 B;EP、Bridge、Switch 等其他设备的 RCB 只能为 128 B。**这意味着当设备完成读请求时,返回的数据包大小不超过设置的RCB值。选择适合系统需求的RCB大小,可以在保证数据传输稳定性的同时,优化系统性能。
64字节RCB:较小的RCB设置会导致更频繁的数据包传输,这在某些情况下可能提高小数据块传输的效率。例如,对于一些需要低延迟的应用,较小的数据包可能意味着更快的响应时间。
128字节RCB:较大的RCB设置减少了数据包传输的频率,有利于大量数据的传输效率。在数据吞吐量要求较高的应用场合,较大的RCB可以减少系统的总体开销,提高数据传输速度。
🌟1.3 RCB的应用
当主机或设备在PCI Express (PCIe) 总线上发出一笔Memory Read请求(MRd)时,目标设备或内存控制器需要按照相应的规则进行处理,并生成一个或多个完整的响应(Completion,Cpl)。为了满足RCB(Read Completion Boundary)规则,返回的数据可能需要被拆分成多个CplD(Completion with Data)数据包。这里是一个简化的步骤说明,展示满足RCB规则的Completion响应策略:
步骤 1: 分析MRd请求 设备首先分析MRd请求,获取以下信息: 读取的起始地址(Address) 读取的数据长度(Length)
请求者的ID和Tag,以便之后能将完成数据与请求正确匹配 步骤 2: 检查RCB设置
确认当前系统设置的RCB值(通常是64或128字节),这将影响拆分策略。 步骤 3: 计算是否跨越RCB边界
检查请求读取是否会跨越RCB边界。例如,如果RCB是64字节,确保读取操作不会在一个64字节的对齐边界开始,并在另一个64字节的对齐边界结束,而是在RCB定义的同一个边界内完成。
步骤 4: 拆分完成数据
如果MRd请求的长度过长,使得数据不能在一个CplD中返回,或者读取操作跨越了RCB边界,那么目标设备需要将数据拆分成几个CplD数据包。每个数据包都需要:
遵守MPS(Max Payload Size)的限制 确保CplD中的数据不会跨越RCB边界 遵循系统内存及对齐规则 步骤 5:
构建CplD数据包 为每一段数据构建CplD数据包,包括必要的头部信息,如请求者ID、Tag、完成状态、Byte
Count等,并将实际数据附加到数据包中。 步骤 6: 发送CplD数据包
依次发送所有CplD数据包,包括可能因RCB而被拆分的多个数据段。 步骤 7: 等待所有CplD被确认
请求方接收到所有的CplD数据包,并确认数据是否完整和正确。
通过以上步骤,一个MRd请求得到满足RCB规则的Completion响应。这种拆分策略有助于维持PCIe系统的稳定性和数据完整性,同时也确保了数据在不同的设备间能够高效地传输。这个过程有时也可以由硬件逻辑自动完成,无需软件参与。
🌟1.4 举例说明:
示例1:地址对齐,RCB=64
请求:地址0x10000(64对齐),长度C0h(192字节)。
可能的完成包组合:
192字节(单包):覆盖3个完整的64字节块。
128+64:覆盖前两个64字节块(128字节)和一个单独块(64字节)。
64+128:覆盖一个块(64字节)和后两个块(128字节)。
64+64+64:三个独立的64字节块。
关键:所有包的起始地址对齐64,且总长度覆盖192字节。
示例2:地址对齐,RCB=128
请求:地址0x10000(128对齐),长度C0h(192字节)。
可能的完成包组合:
192字节(单包):允许(若设备支持大于128字节的包)。
128+64:覆盖前128字节(1个块)和剩余64字节(部分块,但起始地址对齐128)。
关键:完成包起始地址必须对齐128,但允许最后一个包小于RCB。
示例3:地址未对齐,RCB=64
请求:地址0x10020(未对齐64),长度100h(256字节)。
拆分逻辑:
第一个包:覆盖未对齐部分(32字节,地址0x10020到0x1003F)。
剩余部分:起始地址0x10040(对齐64),需按64字节块拆分。
可能的组合:
32+224:32字节(未对齐部分) + 224字节(起始对齐)。
32+64+160:32 + 64(对齐块) + 160(后续对齐块)。
其他组合需满足起始地址对齐,如32+64+64+64+32或32+128+96。
关键:首个包处理未对齐部分,后续包按RCB对齐拆分。
示例4:Endpoint的完成包拆分
请求:地址0x10020,长度100h(256字节)。
可能的组合:
256字节(单包):若Endpoint支持。
96+160:96字节(覆盖未对齐部分0x10020-0x1007F) + 160字节(对齐部分)。
96+128+32:96(未对齐) + 128(对齐块) + 32(剩余部分)。
关键:Endpoint可能更灵活,但起始地址仍需对齐RCB。
✨二、MPS介绍
🌟2.1 什么是MPS?
MPS(Max Payload Size)表示TLP报文中数据负载的长度。PCIe总线规MPS的最大值为4KB,但PCIe设备并不一定都能够按照最大长度发送数据负载。因此实际使用的MPS由链路两端的设备Function协商决定。当发送的数据长度超过MPS时,这段数据会被分割成多个TLP报文发送,若接收的TLP报文数据负载超过MPS,则接收端会认为这是一个非法的TLP。对于存储器读完成TLP报文,数据负载的长度也不能超过MPS,如果超过MPS,则需要发送多个读完成报文,同时也要满足RCB的要求。
在PCIe配置空间中,有两个寄存器,Device Capabilities记录的是PCIe Function的MPS能力,Device Control寄存器可以配置MPS的大小
Max_Payload_Size Supported的值和MPS对应关下如下:
🌟2.2 不同的MPS的作用
📌MPS的大小在系统初始化或配置时设定,通常可以从128字节到4096字节不等。不同大小的MPS对PCIe系统的性能有不同的影响,主要体现在以下几个方面:
提高数据传输效率
较大的MPS可以减少为传输相同数据量需要的TLP数量,因此可以减少交易层包的开销(如头部、确认等),从而提高数据传输的整体效率。例如,当传输大量数据时,使用较大的MPS可以减少总线事务次数,并且由于每次事务都有相对固定的开销,因此更大的MPS通常意味着更高的吞吐率。降低延迟
小的MPS意味着数据包快速完成,这可能对于延迟敏感的应用非常关键,如实时系统或某些互动游戏。较小的数据包可以更快地被处理和确认,从而降低了数据传输的延迟。兼容性
在多个设备连接的PCIe网络中,MPS的大小必须在所有设备之间进行协调,因此需要选择一个所有设备都支持的MPS值。选择过大的MPS可能会引起兼容性问题,因为不是所有设备都能处理大尺寸的数据包。资源利用
较大的MPS可能需要更多的系统内存和缓存来缓存数据包,这对较小的或资源受限的系统可能是一个问题。相反,小的MPS则可能允许系统更节省地使用内存资源。系统性能平衡
较大的MPS可能有助于实现更高的数据吞吐率,但如果总线或设备负载较重,大的数据包可能导致队列延迟增加。因此,根据系统的特定需求和工作负载,可能需要调整MPS以实现性能和响应时间之间的最佳平衡。流量控制
大尺寸的MPS可能导致部分设备在短时间内被大量数据所淹没,这就需要更精细的流量控制机制。较小的MPS可以让流量控制更为灵活,减少因缓冲区溢出而导致的传输延迟或中断。
综上所述,MPS的不同大小直接影响数据在PCIe总线上传输的方式,以及系统性能的多个方面。因此,选择合适的MPS值非常重要,需要充分考虑系统的设计、工作负载类型和设备能力。
✨三、MRRS介绍
🌟3.1 什么是MRRS?
MRRS(Max Read Request Size)参数决定了PCIe设备Function使用存储器读请求,一次能从目标设备读取多少数据,即PCIe设备Function的读请求TLP中的Lewngth字段不能超过MRRS。若PCIe设备Function使用存储器读请求读取的数据长度超过了MRRS,则需要发送多个存储器读请求TLP。PCIe总线规定MRRS最大值为4KB,通常情况下PCIe设备Function的MRRS都会小于这个值。
在PCIe设备配置空间中,PCI Express Capability Structure的Device Control寄存器用于设置MRRS。对于多Function的PCIe设备,每个Function的MRRS可能不同。若PCIe设备Function的Max_Read_Request_Size固定为128字节,则Max_Read_Request_Size位域可实现为只读,且值为000b。
MRRS对照如下
🌟3.2 MRRS作用
📌在PCI Express (PCIe) 架构中,MRRS(Max Read Request Size)是指设备在发出单个读请求(MemoryRead TLP)时所能请求的最大数据量。
与MPS(Max PayloadSize)相似,MRRS也是在系统初始化或配置时设定的,并且通常也可以从128字节到4096字节不等。
不同大小的MRRS会对PCIe系统的性能产生以下影响: 提升带宽利用率
较大的MRRS值允许发出读请求的设备一次性请求更多的数据,这在读取大块数据时提高了带宽利用率。如果设备需要连续的大量数据,较大的MRRS可以减少所需的总请求次数,从而减少请求的开销并提高效率。
降低延迟
对于需要频繁访问但数据量较小的应用,较小的MRRS可能更有利。小的MRRS可以减少在任何给定时间内未完成请求的数量,因此可以在高负载系统中降低延迟。这对于延迟敏感的任务很关键。提高系统响应性
MRRS较小可以使系统更快地响应各种大小的读取请求,尤其是在多任务环境中,可以帮助平衡不同设备之间的响应时间,从而提高整体系统的响应性。缓存和内存管理
大的MRRS值可能需要更多的缓存空间和内存资源来处理单个较大的数据请求。对于资源有限的系统,较大的MRRS可能会造成资源压力。而较小的MRRS可帮助系统优化内存和缓存的使用。流量控制
系统需适当处理较大的MRRS请求,否则可能会造成数据包占有总线时间过长,导致其他设备无法及时发送或接收数据。因此,大的MRRS可能需要更精细的流量控制策略。兼容性问题
在多设备环境中,MRRS需要在所有设备间有良好的协调性。如果一台设备具备较大的MRRS而另一台设备不支持,就可能导致兼容性问题,因为不是所有设备都能处理或响应大尺寸的数据请求。系统性能平衡
正确的MRRS设置可以帮助平衡传输效率与系统响应性之间的关系。系统设计师需要根据具体的应用工作负载和系统的硬件能力来确定最合适的MRRS大小。
✨四、MPS、MRRS的修改
这里主要拿Linux举例
我们先用lspci 查看当前这个RC的MPS和MRRS
⚠️注意:这里的能力寄存器显示MaxPayload最大只能到512bytes,所有这里配置512以上也是没有用的。
然后我们Device Control Register的偏移为0x8,这里的基地址是0x70,所以这里我们偏移就是0x78。这里我们修改的MPS为128bytes,这里修改的就是寄存器的bit5-7,所以这里就是0x10。修改完可以retrain一下link,让EP和RC协商到一致的MPS。
这里看到MPS就已经修改为128bytes了,MRRS的修改方式也是一样,只是修改的bit位不一样,MRRS为bit12-14。
相关文章:

PCIe协议之RCB、MPS、MRRS详解
✨前言: PCIe总线的存储器写请求、存储器读完成等TLP中含有数据负载,即Data Payload。Data Payload的长度和MPS(Max Payload Size)、MRRS(Max Read Request Size)和RCB(Read Completion Bounda…...

达梦数据库在Linux,信创云 安装,备份,还原
(一)系统环境检查 1操作系统:确认使用的是国产麒麟操作系统,检查系统版本是否兼容达梦数据库 V8。可以通过以下命令查看系统版本: cat /etc/os-release 2硬件资源:确保服务器具备足够的硬件资源࿰…...

使用Dockerfile打包java项目生成镜像部署到Linux_java项目打docker镜像的dockerfile
比起容器、镜像来说,Dockerfile 非常普通,它就是一个纯文本,里面记录了一系列的构建指令,比如选择基础镜像、拷贝文件、运行脚本等等,每个指令都会生成一个 Layer,而 Docker 顺序执行这个文件里的所有步骤&…...

爬虫案例九js逆向爬取CBA中国篮球网
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、CBA网站分析二、代码 前言 提示:这里可以添加本文要记录的大概内容: 爬取CBA中国篮球网 提示:以下是本篇文章正文内容…...

【DeepSeek】Ubuntu快速部署DeepSeek(Ollama方式)
文章目录 人人都该学习的DeepSeekDeepSeek不同版本功能差异DeepSeek与硬件直接的关系DeepSeek系统兼容性部署方式选择部署步骤(Ollama方式)1.选定适合的deepseek版本2.环境准备3.安装Ollama4.部署deepseek5.测试使用 人人都该学习的DeepSeek DeepSeek 作…...

C++后端服务器开发技术栈有哪些?有哪些资源或开源库拿来用?
一、 C后台服务器开发是一个涉及多方面技术选择的复杂领域,特别是在高性能、高并发的场景下。以下是C后台服务器开发的一种常见技术路线,涵盖了从基础到高级的技术栈。 1. 基础技术栈 C标准库 C11/C14/C17/C20:使用现代C特性,如…...

基于SpringBoot的餐厅点餐管理系统设计与实现(源码+SQL脚本+LW+部署讲解等)
专注于大学生项目实战开发,讲解,毕业答疑辅导,欢迎高校老师/同行前辈交流合作✌。 技术范围:SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容:…...

服务端和客户端通信(TCP)
服务端 using System; using System.Collections.Generic; using System.Linq; using System.Net; using System.Net.Sockets; using System.Text; using System.Threading.Tasks;namespace TeachTcpServer {class Program{static void Main(string[] args){#region 知识点一 …...

Java 大视界 -- Java 大数据在智能体育赛事运动员表现分析与训练优化中的应用(122)
💖亲爱的朋友们,热烈欢迎来到 青云交的博客!能与诸位在此相逢,我倍感荣幸。在这飞速更迭的时代,我们都渴望一方心灵净土,而 我的博客 正是这样温暖的所在。这里为你呈上趣味与实用兼具的知识,也…...

基于Spring Boot的多级缓存架构实现
基于Spring Boot的多级缓存架构实现 以下是一个基于Spring Boot的多级缓存架构实现示例 多级缓存架构实现方案 1. 依赖配置(pom.xml) <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-star…...

Git与GitHub:理解两者差异及其关系
目录 Git与GitHub:理解两者差异及其关系Git:分布式版本控制系统概述主要特点 GitHub:基于Web的托管服务概述主要特点 Git和GitHub如何互补关系现代开发工作流 结论 Git与GitHub:理解两者差异及其关系 Git:分布式版本控…...

ALG(Alloy+Loki+Grafana)轻量级日志系统
ALG(AlloyLokiGrafana)轻量级日志系统 前提要求 GrafanaMinioNginxPrometheus Grafana日志收集系统旧版是PLG(ProtailLokiGrafana), Protail收集日志, Loki存储, Grafana展示, 后续的Protail不维护了, Grafana推出了Alloy代替Pritial, 除了收集日志外, 还集成管理Prometheus各种…...
【漫话机器学习系列】121.偏导数(Partial Derivative)
偏导数(Partial Derivative)详解 1. 引言 在数学分析、机器学习、物理学和工程学中,我们经常会遇到多个变量的函数。这些函数的输出不仅取决于一个变量,而是由多个变量共同决定的。那么,当其中某一个变量发生变化时&…...

Deepseek可以通过多种方式帮助CAD加速工作
自动化操作:通过Deepseek的AI能力,可以编写脚本来自动化重复性任务。例如,使用Python脚本调用Deepseek API,在CAD中实现自动化操作。 插件开发:结合Deepseek进行二次开发,可以创建自定义的CAD插件。例如&a…...

【工具使用】IDEA 社区版如何创建 Spring Boot 项目(详细教程)
IDEA 社区版如何创建 Spring Boot 项目(详细教程) Spring Boot 以其简洁、高效的特性,成为 Java 开发的主流框架之一。虽然 IntelliJ IDEA 专业版提供了Spring Boot 项目向导,但 社区版(Community Edition)…...

QT中串口打开按钮如何点击打开后又能点击关闭
前言: if (!portOpen) { // 打开串口 if (!sp18Controller->initializePort("COM5", 38400)) { QMessageBox::critical(this, "Error", "Failed to open serial port."); return; } ui->btnOpenPort_2->setText("Close…...

【AI深度学习基础】PyTorch初探
引言 PyTorch 是由 Facebook 开源的深度学习框架,专门针对 GPU 加速的深度神经网络编程,它的核心概念包括张量(Tensor)、计算图和自动求导机制。PyTorch作为Facebook开源的深度学习框架,凭借其动态计算图和直观的API设…...

springboot011基于springboot的课程作业管理系统(源码+包运行+LW+技术指导)
项目描述 临近学期结束,还是毕业设计,你还在做java程序网络编程,期末作业,老师的作业要求觉得难了吗?不知道毕业设计该怎么办?网页功能的数量是否太多?没有合适的类型或系统?等等,你想解决的问题,今天…...

快速从C过度C++(一):namespace,C++的输入和输出,缺省参数,函数重载
📝前言: 本文章适合有一定C语言编程基础的读者浏览,主要介绍从C语言到C过度,我们首先要掌握的一些基础知识,以便于我们快速进入C的学习,为后面的学习打下基础。 这篇文章的主要内容有: 1&#x…...

PostgreSQL时间计算大全:从时间差到时区转换(保姆级教程)
一、时间计算的三大核心场景 当你遇到这些需求时,本文就是你的救星🌟: 倒计时功能:计算活动剩余天数 用户行为分析:统计操作间隔时间 跨国系统:多时区时间统一管理 报表生成:自动计算同比/环…...

laravel es 相关代码 ElasticSearch
来源: github <?phpnamespace App\Http\Controllers;use Elastic\Elasticsearch\ClientBuilder; use Illuminate\Support\Facades\DB;class ElasticSearch extends Controller {public $client null;public function __construct(){$this->client ClientB…...

题目 3220 ⭐因数计数⭐【数理基础】蓝桥杯2024年第十五届省赛
小蓝随手写出了含有 n n n 个正整数的数组 a 1 , a 2 , ⋅ ⋅ ⋅ , a n {a_1, a_2, , a_n} a1,a2,⋅⋅⋅,an ,他发现可以轻松地算出有多少个有序二元组 ( i , j ) (i, j) (i,j) 满足 a j a_j aj 是 a i a_i ai 的一个因数。因此他定义一个整数对 …...

【Java代码审计 | 第十一篇】SSRF漏洞成因及防范
未经许可,不得转载。 文章目录 SSRF漏洞成因Java中发送HTTP请求的函数1、HttpURLConnection2、HttpClient(Java 11)3、第三方库Request库漏洞示例OkHttpClient漏洞示例HttpClients漏洞示例 漏洞代码示例防范标准代码 SSRF SSRF(S…...

RabbitMQ高级特性--消息确认机制
目录 一、消息确认 1.消息确认机制 2.手动确认方法 二、代码示例 1. AcknowledgeMode.NONE 1.1 配置文件 1.2 生产者 1.3 消费者 1.4 运行程序 2.AcknowledgeMode.AUTO 3.AcknowledgeMode.MANUAL 一、消息确认 1.消息确认机制 生产者发送消息之后,到达消…...

C++复试笔记(一)
Setw 是C中用于设置输出字段宽度的函数。当使用 setw(3) 时,它会设置紧接着的输出字段的最小宽度为3个字符。如果字段内容长度小于3,则会在左侧填充空格以达到指定宽度;如果内容长度大于或等于3,则全部内容将被输出,…...

K8s 1.27.1 实战系列(四)验证集群及应用部署测试
一、验证集群可用性 1、检查节点 kubectl get nodes ------------------------------------------------------ NAME STATUS ROLES AGE VERSION k8s-master Ready control-plane 3h48m v1.27.1 k8s-node1 Ready <none> …...

基于Spring Boot的健美操评分管理系统设计与实现(LW+源码+讲解)
专注于大学生项目实战开发,讲解,毕业答疑辅导,欢迎高校老师/同行前辈交流合作✌。 技术范围:SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容:…...

H5页面在移动端自动横屏
首先需要再head标签添加这样一段代码 <meta name="viewport" content="width=device-width,height=device-width,initial-scale=1.0,user-scalable=no">因为需求是为了满足WEB端和手机端都可以查看整体效果 但由于UI没有设计移动端的样式 所以我想说…...

【从0到1搞懂大模型】神经网络的实现:数据策略、模型调优与评估体系(3)
一、数据集的划分 (1)按一定比例划分为训练集和测试集 我们通常取8-2、7-3、6-4、5-5比例切分,直接将数据随机划分为训练集和测试集,然后使用训练集来生成模型,再用测试集来测试模型的正确率和误差,以验证…...

从0到1入门RabbitMQ
一、同步调用 优势:时效性强,等待到结果后才返回 缺点: 拓展性差性能下降级联失败问题 二、异步调用 优势: 耦合度低,拓展性强异步调用,无需等待,性能好故障隔离,下游服务故障不影响…...