PCie协议之-TLP Header详解(一)

news2024/11/19 7:35:14

✨前言:

在PCIe通信过程中,事务层数据包(Transaction Layer Packets,简称TLP)扮演着非常重要的角色。TLP用于在设备之间传递数据和控制信息,它们是PCIe的基本信息传输单元。
TLP可分为几个部分,最核心的是TLP Header,它负责携带有关数据包的关键信息,包括数据包类型、长度以及传输方向等等。下面是TLP Header的详细结构以及各部分的作用:
格式(Format)和类型(Type)字段:这个字段由多个比特组成,两者相结合定义了TLP的类型,例如内存读取、内存写入、I/O操作等等。格式字段告诉我们这个TLP是32位还是64位地址,而类型字段告诉我们是进行读取还是写入等操作。
长度(Length)字段:长度字段告知接收设备这个TLP包含了多少个数据载荷(Data Payload)DWORDs(32-bit words)。这对于正确解析TLP非常重要。
请求者ID(Requester ID)和目标ID(Completer ID)字段:这些字段包含了发起TLP的设备和预期接收这个TLP的设备的ID。在回应一个操作时,这两个字段会互换其值。
标记(Tag)字段:标记字段用于将具体的TLP关联到发起它的特定事务。这对于支持多个并发事务的设备来说尤其重要。
第一和最后的DW地址(First and Last DW Byte Enables)字段:对于内存写入操作,这些字段指示了在数据包的第一个和最后一个DWORD中,哪些字节是有效的。这对于包括不是4字节倍数的内存写入操作很重要。
地址(Address)字段:对于需要访问特定硬件地址的操作(例如内存读/写),此字段包含所需的地址。其精确格式和长度(32-bit或64-bit)取决于TLP的格式和类型

✨TLP格式

事务层包(TLP)的一般格式如下图所示:
在这里插入图片描述
TLP Header为3DW或者4DW,Data Payload为1-1024DW,最后的TLP Digest(ECRC)是可选的,为1DW。
TLP Header在整个TLP的位置如下图所示,需要注意的是,TLP Header的格式和内容都会随着TLP的类型和路由方式的改变而改变。
在这里插入图片描述
TLP的类型和路由方式由Fmt和Type所决定,这在前面关于TLP路由的文章中已经详细的介绍过。上图显示的是各种不同格式的TLP Header的相同的部分。
每一个Field的作用与意义如下表所示:
在这里插入图片描述
在这里插入图片描述

✨Byte Enable

下面分别详细地介绍一下Byte Enable,在PCIe中Data Payload的单位是DW,也就是说数据大小(地址)需要以DW作为对齐。但是很多情况下,数据的大小并不是DW的整数倍,因此PCIe引入了Byte Enable来解决这一问题。
使用Byte Enable需要遵循一下原则:
· Byte Enable为高电平有效,低电平(0)表示Data Payload的对应Byte将被认为是无效的,即不被Completer使用。
· 如果有效数据小于1DW,则Last DW Byte Enable应全部为0。
· 如果Data Payload大于1DW,则First DW Byte Enable至少有一位是有效的。
· 如果Data Payload大于或等于3DW,则First DW Byte Enable和Last DW Byte Enable当中的有效位必须是连续的。即这种情况下,Byte Enable只能用于调整起始地址和结束地址。
· 如果Data Payload等于1DW,则First DW Byte Enable中的有效位可以是不连续的。
· 如果Data Payload等于2DW,则First DW Byte Enable和Last DW Byte Enable中的有效位都可以是不连续的。
· 写请求中的DW等于1,但是First DW Byte Enable中没有任何一位是有效的,也是允许的,但是这样的请求对于Completer没有任何作用。
· 如果读请求DW等于1,但是First DW Byte Enable中没有任何一位是有效的,此时Completer会返回1DW的Data Payload,只是其中的数据都是无效的。这一方式常备用于Flush Mechanism。

一个简单的Byte Enable使用的例子,如下图所示:
在这里插入图片描述

🌟Byte Enable的作用

Byte Enable的主要作用是提供字节级别的访问控制,这使得PCIe能够更加灵活和高效地处理数据。它的存在允许:

非对齐访问:使PCIe能够处理非对齐的内存地址访问请求,这是在现代计算系统中常见的需求。
部分字节操作:支持对小于4字节的数据进行写入操作,这有助于减少不必要的数据传输,提高系统的数据处理效率。
数据保护:确保在执行部分字节写入时,同一DWORD内的其他字节内容不会被意外修改,保护了数据的完整性。
总的来说,Byte Enable信号在PCIe架构中提供了重要的字节级别精度和灵活性,是优化数据传输、提高效率和保护数据完整性的关键机制。

🌟关于TLP的Data Payload有:

· Data Payload的大小由TLP Header中的Length决定。
· Data Payload的数据采用的是Little Endian,即低字节存放于低地址中。
· Data Payload的大小并不是有效的数据的大小,有效数据的大小是由Data Payload和Byte Enable共同决定的。
· 当TLP类型为Message时,Length一般是保留的(Reserved),除非该Message是带有数据的(MsgD)。
· TLP的Data Payload大小不得超过Max_Payload_Size的值,该值位于Device Control Register中。对于比较大的数据量,因此只能分多次进行发送。对于读请求来说,并没有Data Payload,也就是说该规则并不适用于读请求。
· 需要特别注意的是,起始地址和结束地址之间不能够跨越4KB的地址边界。

📌下面详细解释为什么buffer bound to 4KB address boundary对系统至关重要:

内存管理和系统架构
计算机的内存管理单元 (MMU)通常以页面为单位管理物理内存,而操作系统中的常见页面大小就是4KB。不允许TLP跨越4KB边界有助于:

确保TLP对应的数据传输在同一个内存页面内,简化内存的管理与分配。 有助于避免产生额外的页面错误或页面交换行为,尤其是在对物理地址访问时。
缓存一致性 多核处理器和系统中的缓存通常按照缓存行(cache
line)进行组织,而缓存行的大小通常不会超过4KB。确保数据传输不跨越4KB边界有助于:

保持缓存行内的数据一致性,避免一个TLP操作需要更新多个缓存行所带来的复杂性。 减少缓存同步协议所需要处理的情况,降低系统的复杂度。
错误检测和处理 硬件通常会实施一些错误检测和纠正机制,比如ECC(错误校验和纠正)。这些机制也以物理页面为基础。不跨越4KB边界有助于:

在发生错误时,能够准确地定位到错误发生的页面,并进行处理,而不涉及多个页面。 降低出现多位错误的可能性,增强数据的可靠性。
总之,为了保证内存、缓存和错误管理的效率与简洁性,PCIe规范要求TLP的data
payload在进行数据传输时不得跨越4KB边界。这规则不适用于读请求的TLP,因为读请求的TLP本身不携带data
payload,而是请求从远端设备获取数据,返回的是Completion with Data的TLP,它们遵守相同的数据载荷规则。

✨小结:

本章主要介绍TLP Header的构成,下一章再详细介绍TLP Header的格式和作用。

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

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

相关文章

【平衡二叉树】AVL树(双旋)

🎉博主首页: 有趣的中国人 🎉专栏首页: C进阶 🎉其它专栏: C初阶 | Linux | 初阶数据结构 小伙伴们大家好,本片文章将会讲解AVL树的左双选和右双旋的相关内容。 如果看到最后您觉得这篇文章写…

Qt学习笔记1.3.3QtCore-隐式共享

文章目录 概述隐式共享细节类列表 Qt中的许多c类使用隐式数据共享来最大化资源使用并最小化复制。隐式共享类作为参数传递时既安全又高效,因为只传递指向数据的指针,并且只有当函数写入数据时才会复制数据,即写时复制(copy-on-write)。 概述 …

keepalived双机热备超详细入门介绍

keepalived 一、keepalived入门介绍 1.keepalived简介 2.keepalived服务的三个重要功能 2.1.管理LVS负载均衡软件 2.2.实现对LVS集群节点健康检查功能 2.3.作为系统网络服务的高可用功能 3.keepalived高可用故障切换转移原理 4.keepalived安装及主配置文件介绍 …

[BJDCTF 2020]easy_md5、[HNCTF 2022 Week1]Interesting_include、[GDOUCTF 2023]泄露的伪装

目录 [BJDCTF 2020]easy_md5 ffifdyop [SWPUCTF 2021 新生赛]crypto8 [HNCTF 2022 Week1]Interesting_include php://filter协议 [GDOUCTF 2023]泄露的伪装 [BJDCTF 2020]easy_md5 尝试输入一个1,发现输入的内容会通过get传递但是没有其他回显 观察一下响应…

【经验总结】超算互联网服务器 transformers 加载本地模型

1. 背景 使用 超算互联网 的云服务,不能连接外网,只能把模型下载到本地,再上传上去到云服务。 2. 模型下载 在 模型中 https://huggingface.co/models 找到所需的模型后 点击下载 config.json pytorch_model.bin vocab.txt 3. 上传模型文…

【数据可视化01】matplotlib实例3之数据统计

目录 一、引言二、实例介绍1.百分位数为横条形图2.箱线图定制化3.带有自定义填充颜色的箱线图4.箱线图5.箱线图和小提琴图6.二维数据集的置信椭圆 一、引言 matplotlib库 可以用来创建各种静态、动态、交互式的图形,并广泛应用于数据分析和数据可视化领域。 二、实…

C#中json数据序列化和反序列化的最简单方法(C#对象和字符串的相互转换)

文章目录 将C#对象转换为json字符串Newtonsoft模块的安装用Newtonsoft将对象转换为json字符串 将json字符串转换为C#对象 将C#对象转换为json字符串 本介绍将基于C#中的第三方库Newtonsoft进行,因此将分为Newtonsoft模块的安装和使用两部分。该模块的优势在于只需要…

STL----push,insert,empalce

push_back和emplace_back的区别 #include <iostream> #include <vector>using namespace std; class testDemo { public:testDemo(int n) :num(n) {cout << "构造函数" << endl;}testDemo(const testDemo& other) :num(other.num) {cou…

C# 下载安装,使用OfficeOpenXml

下载安装OfficeOpenXml模块 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.IO; using System.Linq; using System.Reflection.Emit; using System.Text; using System.Text.RegularEx…

智能EDM邮件群发工具哪个好?

企业之间的竞争日益激烈&#xff0c;如何高效、精准地触达目标客户&#xff0c;成为每个市场战略家必须面对的挑战。在此背景下&#xff0c;云衔科技凭借其前沿的AI技术和深厚的行业洞察&#xff0c;匠心推出了全方位一站式智能EDM邮件营销服务平台&#xff0c;重新定义了邮件营…

Docker 使用 Fedora 镜像

Fedora 在 Docker 中的使用也非常简单&#xff0c;直接使用命令 docker run -it fedora:latest bash 就可以 pull 到本地的容器中并且运行。 C:\Users\yhu>docker run -it fedora:latest bash Unable to find image fedora:latest locally latest: Pulling from library/fed…

曲线救国:window 安装 docker

你好&#xff0c;我是 shengjk1&#xff0c;多年大厂经验&#xff0c;努力构建 通俗易懂的、好玩的编程语言教程。 欢迎关注&#xff01;你会有如下收益&#xff1a; 了解大厂经验拥有和大厂相匹配的技术等 希望看什么&#xff0c;评论或者私信告诉我&#xff01; 文章目录 一…

【HR】阿里三板斧--20240514

参考https://blog.csdn.net/haydenwang8287/article/details/113541512 头部三板斧 战略能不能落地、文化能不能得到传承、人才能不能得到保障。 头部三板斧适用的核心场景有三个&#xff1a;一是战略不靠谱&#xff1b;二是组织效率低、不聚心&#xff1b;三是人才跟不上。对…

JavaScript精粹(一)

JavaScript&#xff08;简称为JS&#xff09;是一种广泛应用于网页开发的脚本语言&#xff0c;具有以下几个主要作用&#xff1a; 网页交互&#xff1a;JavaScript 可以用于创建动态的网页效果&#xff0c;例如响应用户的操作&#xff0c;实现页面内容的动态更新&#xff0c;以…

LearnOpenGL(十七)之混合

一、丢弃片段 有些图片并不需要半透明&#xff0c;只需要根据纹理颜色值&#xff0c;显示一部分&#xff08;alpha值为1.0&#xff09;&#xff0c;或者不显示一部分&#xff08;alpha值为0.0&#xff09;&#xff0c;没有中间情况。我们需要丢弃(Discard)显示纹理中透明部分的…

GPT搜索鸽了!改升级GPT-4

最近OpenAI太反常&#xff0c;消息一会一变&#xff0c;直让人摸不着头脑。 奥特曼最新宣布&#xff1a;5月13日开发布会&#xff0c;不是GPT-5&#xff0c;也不是盛传的GPT搜索引擎&#xff0c;改成对ChatGP和GPT-4的升级&#xff5e; 消息一出&#xff0c;大伙儿都蒙了。 之…

vscode 通过ssh 远程执行ipynb +可以切换conda env

主要是保证几个点 远程服务器python 环境没问题 conda这些也都有的ssh的账户 是有conda权限的没有免密就输入密码 免密教程就是最基本的那种 公钥copy过去就行了vscode 那几个插件都要装好 开始操作 首先 vscode 点击左侧工具栏中的扩展&#xff0c;搜索“ssh”&#xff0c;…

JVM面试题:85道JVM虚拟机面试题及答案

面试题 1 .简述Java堆的结构&#xff1f;什么是堆中的永久代(Perm Gen space)? JVM整体结构及内存模型 试题回答参考思路&#xff1a; 1、堆结构 JVM的堆是运行时数据区&#xff0c;所有类的实例和数组都是在堆上分配内存。它在JVM启动的时候被创建。对象所占的堆内存是由自…

Java入门之数据类型和变量

1.字面常量 字面常量就是在程序运行中&#xff0c;固定不变的量&#xff0c;例如如下的代码 public class Demo{public static void main(String[] args){System.Out.println("hello world!");System.Out.println(100);System.Out.println(3.14);System.Out.println…

Git 的原理与使用(中)

Git 的原理与使用&#xff08;上&#xff09;中介绍了Git初识&#xff0c;Git的安装与初始化以及工作区、暂存区、版本库相关的概念与操作&#xff0c;本文接着上篇的内容&#xff0c;继续深入介绍Git在的分支管理与远程操作方面的应用。 目录 五、分支管理 1.理解分支 2.创…