PCIe学习笔记(22)
Transaction Ordering
Transaction Ordering Rules
表2-40定义了PCI Express Transactions的排序要求。该表中定义的规则统一适用于PCI Express上所有类型的事务,包括内存、I/O、配置和消息。该表中定义的排序规则适用于单个流量类(TC)。不同TC标签的事务之间没有排序要求。请注意,这也意味着在流经不同虚拟通道的流量之间不需要排序,因为不允许将具有相同TC标签的事务映射到任何PCI Express Link上的多个vc
对于表2-40,列表示第一次发布的事务,行表示随后发布的事务。表项指示两个事务之间的排序关系。表项定义如下:
Yes必须允许第二个事务(行)通过第一个事务(列),以避免死锁。(当阻塞发生时,第二个事务需要通过第一个事务。必须理解公平性以防止饥饿。
Y/N无要求。第二个事务可以选择性地通过第一个事务或被第一个事务阻塞。
No不允许第二个事务通过第一个事务。这是支持生产者/消费者强排序模型所必需的。
A Posted Request(转发请求)是指内存写请求或消息请求。
A Read Request(读请求)是指配置读取请求、I/O读取请求或内存读取请求。
An NPR (Non-Posted Request) with Data(带有数据的非转发请求)是指配置写请求、I/O写请求或原子操作请求。
表2-40中条目的说明:
A2a:转发请求不得通过另一个转发请求,除非A2b适用。
A2b:如果设置了RO,则允许转发请求通过另一个转发请求。如果设置了IDO,并且两个请求者的ID不同,或者两个请求都包含PASID TLP前缀且两个PASID值不同,则允许转发请求通过另一个转发请求。
A3, A4:为了避免死锁,转发请求必须能够通过非转发请求。
A5a:转发请求被允许通过完成事务,但除非A5b适用,否则不必能够通过完成事务。
A5b:在PCI Express到PCI/PCI-X桥接器中,如果PCI/PCI-X总线段以传统PCI模式运行,对于PCI Express到PCI方向的事务,为了避免死锁,转发请求必须能够通过完成事务。
B2a:除非B2b适用,读取请求不得通过转发请求。
B2b:如果设置了IDO,并且两个请求者的ID不同,或者两个请求都包含PASID TLP前缀且两个PSID值不同,则允许读取请求通过转发请求。
C2a:除非C2b适用,带有数据的非转发请求不得通过转发请求。
C2b:设置了“RO”的带有数据的非转发请求(NPR)被允许通过转发请求。如果设置了“IDO”,并且两个请求者的ID不同,或者两个请求都包含PASID TLP前缀且两个PASID值不同,则允许通过转发请求。
B3, B4, C3, C4:非转发请求被允许通过另一个非转发请求。
B5, C5:非转发请求被允许通过完成事务。
D2a:除非D2b适用,完成事务不得通过已转发请求。
D2b:允许I/O或配置写入完成事务通过转发请求。如果设置了RO,则允许完成事务通过转发请求。如果设置了IDO,并且完成事务的完成者ID与转发请求的请求者ID不同,则允许完成事务通过转发请求。
D3, D4:为了避免死锁,完成事务必须能够通过非转发请求。
D5a:具有不同事务ID的完成事务被允许相互通过。
D5b:具有相同事务ID的完成事务不得相互通过。这确保了与单个内存读取请求关联的多个完成事务将保持地址升序排列。
附加规则:
•允许PCI Express Switch去允许设置了宽松排序位的内存写入或消息请求通过任何之前转发的、在同一方向前进的内存写入或消息请求。Switch必须不修改转发宽松排序属性。也允许根复合体去允许请求中的数据字节以任何顺序写入系统内存(字节必须写入正确的系统内存位置。只有写入它们的顺序是未指定的)。
•对于根复合体和交换机,内存写入合并(在[PCI]中定义)是禁止的。
◦注意:这是必需的,以便设备可以被允许优化其接收缓冲区和控制逻辑的内存写入大小匹配其自然预期的大小,而不是被要求支持最大可能的内存写入负载大小。
•禁止合并内存读请求和/或为不同的请求Completion。
•No Snoop位不影响所需的排序行为。
•对于根端口和SW下游端口,Posted Request的接受或Completion必须不依赖于同一流量类中Non-Posted Request的传输。
•对于SW上游端口,Posted Request的接受或Completion必须不依赖于在同一流量分类中Non-Posted Request的下游端口的传输
•对于EP、Bridge和SW上游端口,Posted Request的接受不能依赖于同一流量类中来自同一上游端口的任何TLP的传输。
•对于EP、Bridge和SW上游端口,Non-Posted Request的接受必须不依赖于来自同一流量类中同一上游端口的Non-Posted Request的传输。
•对于EP、Bridge和SW上游端口,Completion的接受必须不依赖于同一流量类别中来自同一上游端口的任何TLP的传输
请注意,EP永远不允许阻止Completion的接受。
•为Non-Posted Request发出的Completion必须以与相应的Non-Posted Request相同的流量类返回。
•支持点对点操作和SW的RC必须对所有转发的流量强制执行事务排序规则。
为了确保无死锁操作,设备不应该将流量从一个虚拟通道转发到另一个虚拟通道。
无死锁操作取决于系统拓扑、支持的虚拟通道数量以及配置的流量类到虚拟通道的映射。
大内存读取vs.多个小内存读取?
例如,如果一个设备从位置1000h发出一个256字节的内存读请求,并且该请求使用两个128字节的Completions返回,可以保证这两个Completions将以以下顺序返回:
1 . Completion返回:数据从1000h到107Fh。
2 . Completion返回:1080h到10FFh的数据。
然而,如果设备发出两个内存读请求,每个128字节,首先到位置1000h,然后到位置1080h,两个完成可能以任意顺序返回
1 . Completion返回:数据从1000h到107Fh。
2 . Completion返回:1080h到10FFh的数据。
-或
1.Completion返回:从1080h到10FFh的数据。
2.Completion返回:数据从1000h到107Fh
由读事务观察到的更新顺序和粒度
作为更新排序的一个例子,假设数据块位于主机内存中,主机CPU首先写入位置a,然后写入另一个位置b。使用单个读事务读取该数据块的请求程序不能保证按照顺序观察这些更新。换句话说,无论位置A和B在数据块中的位置如何,请求者可能在位置B中观察到更新的值,而在位置A中观察到旧的值。除非Completer对更新顺序做出自己的保证(在本规范之外),否则依赖于更新顺序的Requester必须在启动对位置a的后续读取以返回其更新值之前,通过一个读事务观察对位置B的更新。
作为更新粒度的一个例子,如果主机CPU向主机内存写入一个四字(QW),那么从主机内存读取该QW的请求程序可能会看到QW的一部分更新了,而另一部分包含旧值。
虽然本规范没有要求,但强烈建议主机平台保证,当主机CPU将对齐的DW或对齐的qw写入主机内存时,PCI Express读取观察到的更新粒度不会小于DW
cacheline之间不需要排序
Root Complex作为单个内存读取的Completer,从主机内存请求多个cacheline,允许同时获取多个cacheline,以帮助促进多cacheline Completion,受Max_Payload_Size限制。这些缓存读取之间不需要排序关系
由写事务提供的更新顺序和粒度
如果完成者接受了包含多个双字(DWs)且清除了宽松排序位(Relaxed Ordering bit)的单个写入事务,则Completer数据缓冲区中对位置的更新的观察顺序必须是递增的地址顺序。
如果路径上的PCI或PCI- x桥将多个写事务合并为一个事务,则需要这种语义。但是,观察到的对Completer数据缓冲区的更新的粒度超出了本规范的范围。
虽然本规范没有要求,但强烈建议主机平台保证当PCI Express写入更新主机内存时,主机CPU观察到的更新粒度不会小于DW。
作为更新顺序和粒度的一个示例,如果请求程序将QW写入主机内存,在某些情况下,主机CPU从主机内存读取该QW可以观察到第一个DW已更新,第二个DW包含旧值。
相关文章:

PCIe学习笔记(22)
Transaction Ordering Transaction Ordering Rules 表2-40定义了PCI Express Transactions的排序要求。该表中定义的规则统一适用于PCI Express上所有类型的事务,包括内存、I/O、配置和消息。该表中定义的排序规则适用于单个流量类(TC)。不同TC标签的事务之间没有…...
Vue3 依赖注入Provide / Inject
在实际开发中,我们经常需要从父组件向子组件传递数据,一般情况下,我们使用 props。但有时候会遇到深度嵌套的组件,而深层的子组件只需要父组件的部分内容。在这种情况下,如果仍然将 prop 沿着组件链逐级传递下去&#…...

Python | Leetcode Python题解之第332题重新安排行程
题目: 题解: class Solution:def findItinerary(self, tickets: List[List[str]]) -> List[str]:def dfs(curr: str):while vec[curr]:tmp heapq.heappop(vec[curr])dfs(tmp)stack.append(curr)vec collections.defaultdict(list)for depart, arri…...

React状态管理:react-redux和redux-saga(适合由vue转到react的同学)
注意:本文不会把所有知识点都写一遍,并不适合纯新手阅读 首先Redux是一种状态管理方案,本身和react并没有什么联系,redux也可以结合其他框架来用。 react-redux是基于react的一种状态管理实现,他不像vuex那样直接内置在…...

刷题技巧:双指针法的核心思想总结+例题整合+力扣接雨水双指针c++实现
双指针法的核心思想是通过同时操作两个指针来遍历数据结构,通常是数组或链表,以达到优化算法性能的目的。具体来说,双指针法能够减少时间复杂度、空间复杂度,或者简化逻辑结构。以下是双指针法的几个核心思想: ps 下面…...

什么是前端微服务,有何优势
随着互联网技术的发展,传统的单体应用架构已经无法满足复杂业务场景的需求。微服务架构的兴起为后端应用的开发和部署提供了灵活性和可扩展性。与此同时,前端开发也经历了类似的演变,前端微服务作为一种新兴的架构模式应运而生。 一、前端微服…...
小论文写作——02:编故事
一篇论文,可以发水刊,也可以发顶刊顶会,这两者的区别就是一个故事编的好不好。 你的论文ABC,但不能之说有ABC。创新就是看你故事编的怎么样?创新是编出来的。 我们要说:我发现了问题,然后准备…...

GIT企业开发使用介绍
0.认识git git就是一个版本控制器,记录每次的修改以及版本迭代的一个管理系统 至于为什么会有git的出现,主要是为了解决一份代码改了又改,但最后还是要第一版的情况 git 可以控制电脑上所有格式的文档 1.安装git sudo yum install git -y…...
文件上传-前端验证
查看源代码(找验证代码) 1、源代码直接找到验证代码 示例: function checkFileExt(filename){var flag false; //状态var arr ["jpg","png","gif"]; //允许上传的文件//取出上传文件的扩展名var index f…...

ROT加密算法login-RESERVE
ROT算法(字母轮换加密) 也称为Caesar加密,是一种简单的字母替换加密算法。它通过将字母表中的每个字母向后(或向前)移动固定的位置来加密文本。 加密步骤: 选择一个固定的偏移量(通常是1到25之间的整数)&…...

C++ 新特性 | C++20 常用新特性介绍
目录 1、模块(Modules) 2、协程(Coroutines) 3、概念(Concepts) 4、范围(Ranges) 5、三向比较符(three-way comparison) C软件异常排查从入门到精通系列教程(专栏文章列表,欢迎订阅,持续更新...)https…...
Java设计模式之策略模式实践
1、策略接口 /*** 策略接口*/ public interface DemoStrategy {Result execute(); } 2、策略工厂 /*** 策略工厂*/ Component public class DemoFactory {Resourceprivate final Map<String, DemoStrategy> demoStrategy new ConcurrentHashMap<>();public Demo…...
C语言——结构体数组、结构体指针、结构体函数与二级指针
C语言中的结构体(struct)是一种用户自定义的数据类型,它允许你将不同类型的数据项组合成一个单一的类型。结构体数组则是一种特殊的数组,其元素为结构体类型。这意味着你可以在一个数组中存储多个具有相同结构的记录。 定义结构体…...

【4】策略模式
如上图所示,如果要加入一个新的货币,那么就需要对类中的Calculate函数进行修改,这违背了封闭开放原则。 上图中的方式更加合适,搞一个抽象类(方法中可以用多态调用),然后每个货币自己是一个类&a…...

BGP 反射器联邦实验
要求: 1.如图连接网络,合理规划IP地址,AS 200内IGP协议为OSPF 2.R1属于AS 100;R2-R3-R4小AS 234 R5-R6-R7小AS 567,同时声明大AS 200,R8属于AS 300 3.R2-R5 R4-R7 之间为联邦EBGP邻居关系 4.R1-R8之…...

stm32入门学习13-时钟RTC
(一)时钟RTC stm32内部集成了一个秒计数器RTC,用于显示我们日常的时间,如日期年月日,时分秒等,RTC的主要原理就是进行每秒自增,如果我们知道开始记秒的开始时间,就可以计算现在的日…...

vuex properties of undefined (reading ‘getters‘)
前言: 最近打算用vue 写个音乐播放器,在搞 vuex 的时候遇到一个很神奇报错;vuex 姿势练了千百次了,刚开始的时候我一直以为是代码问题,反复检查了带了,依旧报错。 Error in mounted hook: "TypeError:…...

再谈表的约束
文章目录 自增长唯一键外键 自增长 auto_increment:当对应的字段,不给值,会自动的被系统触发,系统会从当前字段中已经有的最大值1操作,得到一个新的不同的值。通常和主键搭配使用,作为逻辑主键。 自增长的…...

认识一下测试策略与测试方案
目录 测试方案 测试策略 测试策略的内容主要包括 测试技术和工具 测试启动、停止和完成标准 风险分析和应对方案 测试范围 测试角色和职责 测试方法和类型 测试工具 测试层级 测试指标 测试可交付成果 测试方案的内容包括 测试目标 测试范围 测试环境 测试策略…...
Gradle 查看包的依赖关系
在 Terminal 中可以通过 gradle 的命令查看项目中使用的依赖库及其版本,并且可以更加直观的看到各个模块中库之间的依赖关系。同时也可以跟踪并解决与库版本冲突有关的问题。 工具查看 在 Android Studio 中选择 View > Tool Windoors > Gradle 或者直接选择…...

Linux应用开发之网络套接字编程(实例篇)
服务端与客户端单连接 服务端代码 #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> …...

JavaSec-RCE
简介 RCE(Remote Code Execution),可以分为:命令注入(Command Injection)、代码注入(Code Injection) 代码注入 1.漏洞场景:Groovy代码注入 Groovy是一种基于JVM的动态语言,语法简洁,支持闭包、动态类型和Java互操作性,…...

黑马Mybatis
Mybatis 表现层:页面展示 业务层:逻辑处理 持久层:持久数据化保存 在这里插入图片描述 Mybatis快速入门 
屋顶变身“发电站” ,中天合创屋面分布式光伏发电项目顺利并网!
5月28日,中天合创屋面分布式光伏发电项目顺利并网发电,该项目位于内蒙古自治区鄂尔多斯市乌审旗,项目利用中天合创聚乙烯、聚丙烯仓库屋面作为场地建设光伏电站,总装机容量为9.96MWp。 项目投运后,每年可节约标煤3670…...
Python爬虫(二):爬虫完整流程
爬虫完整流程详解(7大核心步骤实战技巧) 一、爬虫完整工作流程 以下是爬虫开发的完整流程,我将结合具体技术点和实战经验展开说明: 1. 目标分析与前期准备 网站技术分析: 使用浏览器开发者工具(F12&…...

ios苹果系统,js 滑动屏幕、锚定无效
现象:window.addEventListener监听touch无效,划不动屏幕,但是代码逻辑都有执行到。 scrollIntoView也无效。 原因:这是因为 iOS 的触摸事件处理机制和 touch-action: none 的设置有关。ios有太多得交互动作,从而会影响…...

CVE-2020-17519源码分析与漏洞复现(Flink 任意文件读取)
漏洞概览 漏洞名称:Apache Flink REST API 任意文件读取漏洞CVE编号:CVE-2020-17519CVSS评分:7.5影响版本:Apache Flink 1.11.0、1.11.1、1.11.2修复版本:≥ 1.11.3 或 ≥ 1.12.0漏洞类型:路径遍历&#x…...
十九、【用户管理与权限 - 篇一】后端基础:用户列表与角色模型的初步构建
【用户管理与权限 - 篇一】后端基础:用户列表与角色模型的初步构建 前言准备工作第一部分:回顾 Django 内置的 `User` 模型第二部分:设计并创建 `Role` 和 `UserProfile` 模型第三部分:创建 Serializers第四部分:创建 ViewSets第五部分:注册 API 路由第六部分:后端初步测…...

【Linux】Linux安装并配置RabbitMQ
目录 1. 安装 Erlang 2. 安装 RabbitMQ 2.1.添加 RabbitMQ 仓库 2.2.安装 RabbitMQ 3.配置 3.1.启动和管理服务 4. 访问管理界面 5.安装问题 6.修改密码 7.修改端口 7.1.找到文件 7.2.修改文件 1. 安装 Erlang 由于 RabbitMQ 是用 Erlang 编写的,需要先安…...

对象回调初步研究
_OBJECT_TYPE结构分析 在介绍什么是对象回调前,首先要熟悉下结构 以我们上篇线程回调介绍过的导出的PsProcessType 结构为例,用_OBJECT_TYPE这个结构来解析它,0x80处就是今天要介绍的回调链表,但是先不着急,先把目光…...