PCIe总线-MPS MRRS RCB参数介绍(四)

1.概述

PCIe总线的存储器写请求、存储器读完成等TLP中含有数据负载,即Data Payload。Data Payload的长度和MPS(Max Payload Size)、MRRS(Max Read Request Size)和RCB(Read Completion Boundary)相关。

2.MPS

MPS(Max Payload Size)表示TLP报文中数据负载的长度。PCIe总线规MPS的最大值为4KB,但PCIe设备并不一定都能够按照最大长度发送数据负载。因此实际使用的MPS由链路两端的设备Function协商决定。当发送的数据长度超过MPS时,这段数据会被分割成多个TLP报文发送,若接收的TLP报文数据负载超过MPS,则接收端会认为这是一个非法的TLP。对于存储器读完成TLP报文,数据负载的长度也不能超过MPS,如果超过MPS,则需要发送多个读完成报文,同时也要满足RCB的要求。

在PCIe设备配置空间中,PCI Express Capability Structure中有两个寄存器,Device Capabilities寄存器记录了PCIe设备Function支持的MPS,Device Control寄存器保存主机设置的MPS。对于多Function的PCIe设备,每个Function的MPS可能不同。

Device Capabilities寄存器如下图所示,主机通过该寄存器获取当前PCIe设备Function的MPS大小。

Device_Capabilities_Register

Max_Payload_Size Supported的值和MPS对应关下如下:

取值MPS
000b128 bytes max payload size
001b256 bytes max payload size
010b512 bytes max payload size
011b1024 bytes max payload size
100b2048 bytes max payload size
101b4096 bytes max payload size
110bReserved
111bReserved

Device Control寄存器如下图所示,主机将协商好的MPS写入该该寄存器。实际使用的MPS通常是链路两端设备Function中最小的MPS。

Device_Control_Register

在多数X86处理其系统的MCH或者ICH中,MPS参数为128B,而在PowerPC处理器系统中,MPS大多为256B。目前在大多数EP中,MPS参数不大于512B,因此很多RC的MPS也不大于512B。

MPS参数的大小与PCIe总线的传送效率成正比,MPS越大,带宽利用率越低,反之带宽利用率越高。MPS参数的大小与实时性成反比,MPS越大,某个Function占用总线的时间过长,导致实时性降低,反之实时性越高,对于实时性要求高的PCIe设备Function,MPS参数不应该设置的过大。

3.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。

Device_Control_Register

Max_Read_Request_Size的值和MRRS对应关下如下:

取值MRRS
000b128 bytes maximum Read Request size
001b256 bytes maximum Read Request size
010b512 bytes maximum Read Request size
011b1024 bytes maximum Read Request size
100b2048 bytes maximum Read Request size
101b4096 bytes maximum Read Request size
110bReserved
111bReserved

MRRS和MPS没有关系,MPS描述的是TLP中数据负载的实际长度,而MRRS描述的是存储器读请求TLP需要读取的数据长度,此时TLP中没有有效数据,当返回存储器读完成报文时,数据负载的长度不能大于MPS。

4.RCB

在PCIe总线中,一个存储器读请求TLP需要使用一个或多个存储器读完成报文响应。

存储器读完成报文读取数据的地址若没有跨过RCB(Read Completion Boundary)参数定义的边界,则只需要一个完成报文。例如RC通过存储器读请求读取EP的0xFFFF0000-0xFFFF0010段内存数据,由于读取的内存数据地址没有超过RCB,所以EP只需要一个存储器读完成报文响应即可。

如果存储器读完成报文读取数据的地址跨过RCB(Read Completion Boundary)参数定义的边界,则需要一个或多个完成报文,遵循的原则如下:

  1. 如果读取数据起始地址和结束地址为RCB的整数倍,若读取长度小于等于MPS,则可以使用一个完成报文,若读取长度大于MPS,则需要使用多个完成报文,每个报文长度不超过MPS,起始地址和结束地址按RCB对齐。
  2. 若起始地址没有按RCB对齐,则需要先使用一个完成报文读取起始地址-RCB边界的数据。
  3. 若结束地址没有按RCB对齐,则需要额外使用一个完成报文读取RCB边界-结束地址的数据。
  4. 在2和3的情况下,中间的地址按RCB对齐,则按1的方法读取并返回完成报文。

例如RC通过存储器读请求读取EP的0xFFFEFFF0-0xFFFF00C7段内存数据,EP可以按如下方式进行组织:

方式1方式2方式3
0xFFFEFFF0-0xFFFEFFFF0xFFFEFFF0-0xFFFEFFFF0xFFFEFFF0-0xFFFEFFFF
0xFFFF0000-0xFFFF003F0xFFFF0000-0xFFFF007F0xFFFF0000-0xFFFF00C7
0xFFFF0040-0xFFFF007F0xFFFF0080-0xFFFF00C7
0xFFFF0080-0xFFFF00BF
0xFFFF00C0-0xFFFF00C7

RCB(Read Completion Boundary)定义在PCI Express Capability Structure的Link Control寄存器中,如下图所示,0表示64字节,1表示128字节,默认为64字节。对于Root Ports为只读属性,由硬件设置好,系统软件只需要读取即可。对于Switch Ports,没有意义,硬件设置为0。对于EP或者桥为读写属性,其上游的Root Ports的RCB值为128字节,系统软件需要设置为128字节,否则使用默认值。

RCB

5.应用

如下图所示,使用lspci命令,查看虚拟机里面PCIe桥的某个Root Ports的配置空间,可以看到MPS和MRRS都为128字节,RCB为64字节。

lspci

参考资料

  1. PCIEXPRESS体系结构导读
  2. PCI Express technology 3.0
  3. PCI Express® Base Specification Revision 5.0 Version 1.0

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

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

相关文章

C++ 抽象机制

抽象机制 1. 虚函数 使用关键字virtual 声明的函数,意思是可能随后在其派生类中重新定义。 纯虚函数 在声明的末尾使用0 的函数,说明是纯虚函数。 抽象类 含有纯虚函数多的类称为抽象类(abstract class). 多态类型 如果一个类负责为其他一些类提供接…

unity入门——按钮点击了却无法调用函数

查阅了一番都没有解决问题,最后发现问题是由button的Onclick()事件绑定了代码脚本而不是游戏对象导致的。 如果Onclick()事件绑定的是代码脚本,则下拉框里没有函数,但是点击MonoScript后能手动填入函数名(本以为这样就能实现调用…

State.initState() must be a void method without an `async` keyword错误解析

文章目录 报错问题报错的代码 错误原因解决方法解析 另外的方法 报错问题 State.initState() must be a void method without an async keyword如下图: 报错的代码 报错的代码如下: overridevoid initState() async{super.initState();await getConf…

openssl3.2 - exp - 使用默认的函数宏,在release版中也会引入__FILE__

文章目录 openssl3.2 - exp - 使用默认的函数宏,在release版中也会引入__FILE__概述笔记验证是否__FILE__在release版下也能用?将openssl编译成release版的,看看CRYPTO_free()是否只需要一个参数就行?将工程中的openssl相关的库换…

重定义大语言模型的记忆能力:对抗性压缩如何挑战现有测量法

DeepVisionary 每日深度学习前沿科技推送&顶会论文分享,与你一起了解前沿深度学习信息! Rethinking LLM Memorization through the Lens of Adversarial Compression 引言:探索大型语言模型的记忆能力 在当今信息时代,大型…

Window(Qt/Vs)软件添加版本信息

Window(Qt/Vs)软件添加版本信息 文章目录 Window(Qt/Vs)软件添加版本信息VS添加版本信息添加资源文件添加版本定义头自动更新版本添加批处理脚本设置生成事件 Qt添加版本信息添加资源文件文件信息修改自动更新版本 CMake添加版本信…

#ESP32S3R8N8建立工程(VSCODE)点亮LED

1.参考文档 【立创ESP32S3R8N8】IDF入门手册 - 飞书云文档 (feishu.cn)https://lceda001.feishu.cn/wiki/GOIlwwfbIi1SC3k8594cDeFVn8g 2.建立工程 3.运行效果 4.更改配置 5.插播 之前配置的环境是有问题的,就算有自动检测也要仔细检查,必须严格按照以…

VMware安装ubuntun虚拟机使用桥接模式无法上网问题解决

问题:最近准备使用VMware虚拟机搭建k8s集群服务,因为需要在同一个网段下,我使用桥接的方式,我发现主机在使用有线连接时虚拟机网络连接正常,但是使用无线网就显示连接不上网络。 解决方法 一、查看网络连接&#xff…

aardio封装库) 微软开源的js引擎(ChakraCore)

前言 做爬虫肯定少不了JavaScript引擎的使用,比如在Python中现在一般用pyexecjs2来执行JavaScript代码,另外还有一些其他执行JavaScript的库: https://github.com/eight04/node_vm2: rpc调用nodejs,需要安装nodehttps://github.…

Spring Data JPA数据批量插入、批量更新真的用对了吗

Spring Data JPA系列 1、SpringBoot集成JPA及基本使用 2、Spring Data JPA Criteria查询、部分字段查询 3、Spring Data JPA数据批量插入、批量更新真的用对了吗 前言 在前两篇文章已经介绍过,在使用Spring Data JPA时,DAO层的Respository通过继承J…

BigKey的危害

1.2.1、BigKey的危害 网络阻塞 对BigKey执行读请求时,少量的QPS就可能导致带宽使用率被占满,导致Redis实例,乃至所在物理机变慢 数据倾斜 BigKey所在的Redis实例内存使用率远超其他实例,无法使数据分片的内存资源达到均衡 Redis阻…

Python中动画显示与gif生成

1. 动画生成 主要使用的是 matplotlib.animation ,具体示例如下: import matplotlib.pyplot as plt import matplotlib.animation as animation import numpy as np fig, ax plt.subplots() t np.linspace(0, 3, 40) g -9.81 v0 12 z g * t**2 / …

新建stm32工程模板步骤

1.先使用keil新建一个project的基本代码 2.stm32启动文件添加 将stm32的启动文件,在原工程当中新建一个Start文件夹把相关的启动文件放到文件夹当中 然后还需要找到下面三个文件 stm32f10x.h是stm32的外设寄存器的声明和定义,后面那两个文件用于配置系…

【Docker】搭建一个媒体服务器插件后端API服务 - MetaTube

【Docker】搭建一个媒体服务器插件后端API服务 - MetaTube 前言 本教程基于群晖的NAS设备DS423的docker功能进行搭建,DSM版为 7.2.1-69057 Update 5。 简介 MetaTube 是一个媒体服务器插件,主要用于 Emby 和 Jellyfin 媒体服务器。它的主要功能是从互…

C++之const用法小结

在C中,const关键字具有多种用法,主要用于声明常量,确保某些变量的值在程序运行期间不会被修改。以下是const在C中的一些常见用法: 1.声明常量: 使用const声明的变量是常量,其值在初始化后不能再被修改。 …

【数据结构】链表专题2

前言 本篇博客继续探讨有关链表的专题,这片博客的题,提前打个预防针,有点意思哦,哈哈哈,话不多说,进入正文 💓 个人主页:小张同学zkf ⏩ 文章专栏:数据结构 若有问题 评论…

ASP.NET淘宝店主交易管理系统的设计与实现

摘 要 淘宝店主交易管理系统主要采用了ASPACCESS的B/S设计模式,通过网络之间的数据交换来实现客户、商品、交易的管理和对客户、商品、交易统计工作,从而提高淘宝店主在管理网店过程中的工作效率和质量。 系统分为基本资料模块,统计资料模…

北京大学肖臻老师《区块链技术与应用》P14(ETH概述)和P15(ETH账户)

1️⃣ 参考 北京大学肖臻老师《区块链技术与应用》 P14 - ETH概述篇P15 - ETH账户篇 1️⃣4️⃣ETH概述 ① 比特币与以太坊的对比 比特币(区块链 1.0)以太坊(区块链 2.0)出块时间大约10 min十几秒mining puzzle计算密集型Memo…

DRF中的请求入口分析及request对象分析

DRF中的请求入口分析及request对象分析 django restframework框架是在django的基础上又给我们提供了很多方便的功能,让我们可以更便捷基于django开发restful API 1 drf项目 pip install django pip install djangorestframework1.1 核心配置 INSTALLED_APPS [d…

【ARMv8/v9 系统寄存 3 -- system counter CNTPCT_EL0】

文章目录 ARMv8/v9 system countersystem counter读取函数实现 ARMv8/v9 system counter 所有使用Arm处理器的系统中都会包含一个标准化的通用定时器(Generic Timer)框架。这个通用定时器系统提供了一个系统计数器(System Counter&#xff0…