了解PCI Express的Posted传输与Non-Posted传输
0.写在前面
本文首发于公众号【两猿社】,后续将在公众号内持续更新~
其实算下来接触PCIe很久了,但是由于之前换工作,一直没有系统的学习和练手项目,现在新项目买了Synopsys的PCIe IP,总算是有机会和时间来整理学习了~~~
目前PCI Express总线取代PCI总线成为PC局部总线的主流,且PCIe在很大程度上继承了PCI的设计思想,可以说PCI是PCIe的基础,本文所重点讲解的Posted和Non-Posted传输也是基于PCI总线讲解,但在PCIe总线中绝大部分是相同的,PCI中的HOST主桥可以看做RC,PCI桥可以看做Switch,PCI设备即EP。
1.简介
PCI规定了两种数据传输方式,分别是Posted传输和Non-posted传输,也叫做Posted事务和Non-Posted事务。在PCIe数据传输中同样也使用这两种方式,但在PCI总线中,Non-Posted传输可以使用Delayed方式完成,而在PCIe总线中所有的 Non-Posted传输都使用Split方式完成,不再使用Delayed方式。
1.Posted传输
Posted总线事务是指PCI主设备向目标设备进行数据传输时,数据到达PCI桥后,由PCI桥接管来自上游总线的总线事务,并将其转发到下游总线,此时上游总线可释放。
使用这种数据传输方式,数据请求在通过PCI总线后,就可以逐级释放总线资源。
下面以DMA写操作为例,说明PCI的Posted传输(DMA操作即PCI设备主动对系统存储器进行操作)。
PCI设备11向主存储器写数据:
- 首先PC设备11将主存储器写请求发向PCI总线x1,注意这个写请求使用的地址是PCI总线域的地址。
- PCI总线x1上的所有设备监听这个请求,因为PCI设备11是向处理器的存储器写数据,所以PCI总线x1上的 PCI Agent都不会接收这个数据请求。
- PCI桥x1发现当前总线事务使用的PCI总线地址不是其下游设备使用的PCI总线地址,则接收这个请求,并结束来自PCI设备11的 Posted存储器写请求,将这个数据请求推到上游PCI总线上,即PCI总线x0。
- PCI总线x0上的所有设备包括HOST主桥将监听这个请求,PCI总线x0上的PCI设备也不会接收这个请求,此时这个数据请求由HOST主桥x接收,并结束PCI桥x1的Posted存储器写请求。
- HOST主桥x发现这个数据请求发向存储器,则将来自PCI总线x0的PCI总线地址转换为存储器域地址,通过存储器控制器将数据写入存储器,完成PCI设备11的DMA写操作(没有完成报文)。
2.Non-Posted传输
Non-Posted总线事务是指PCI主设备向目标设备进行数据传输时,数据必须到达最终目的地后才能结束当前事务总线的传输方式。
PCI总线在没有结束当前总线事务时必须等待传输完成,不会释放总线资源。这种等待将严重阻塞当前的PCI总线的其他数据传送。因此在PCI总线中使用Delayed方式完成Non-Posted,在PCIe总线中使用Split方式完成 Non-Posted总线事务。
PCI设备进行DMA读与DMA写过程类似,不过存储器读总线事务是使用Non-Posted总线事务。
PCI设备11向主存储器读数据:
- 首先PCI设备11将存储器读请求发向PCI总线x1。
- PCI总线x1上的所有设备监听这个请求,因为PCI设备11是从存储器中读取数据,所以PCI总线x1上的设备不会接收这个请求。PCI桥x1发现下游PCI总线没有设备接收,则接收这个数据请求,并将它推到上游PCI总线上,即PCI总线x0上。
- PCI总线x0上的设备监听这个请求,也不会接受这个数据请求,最后这个数据请求被HOST主桥x接收。
- HOST主桥发现这个数据请求是发向主存储器的,则将PCI总线x0的PCI总线地址转为存储器地址,之后通过控制器将数据读出,带着读完成信息转发到HOST主桥x。
- HOST主桥x将这个带数据的读完成事务经由PCI桥x1传递到PCI设备11,设备11接收到这个数据后结束DMA读(有完成报文)。
在上述Non-Posted总线事务中,只有读完成依次通过PCI总线x1和x0后,存储器读总线事务才不继续占用PCI总线x1和x0的资源。可以发现这种传输并不合理,PCI总线为了解决这个总线拥塞问题,使用Delayed传输方式。
3.Split传输方式
在PCIe总线中,有以下几种传输:存储器读写、I/O读写和配置读写请求TLP,这些TLP由以下几类报文组成。
存储器读请求TLP和读完成TLP
存储器写请求TLP
原子操作请求和完成报文
I/O读写请求TLP和读写完成TLP
配置读写请求TLP和配置读写完成TLP
消息报文(Messages)
以上几种类型中,除存储器写请求使用Posted总线事务外,其余的传输类型都使用Non-Posted总线事务,上面提到Non-Posted总线事务在PCI和PCIe中会转换为Delayed事务和Split事务进行。
PCI总线的Delayed传输使用Retry的方式进行,这里不再讲解,重点对PCIe总线中的Split总线事务进行讲解。
Split总线事务替代了PCI总线的Delayed数据传输方式,提高了Non-Posted总线事务的传输效率。Split总线事务是在PCI-X中提出,而PCIe也继承了这种传输方式。
下面以PCI-X中的Split传输为例。
PCI-X在进行存储器读总线事务时,总线事务的发起方(Requester)使用Split总线事务与总线事务的接收端(Completer)进行数据交换,步骤如下:
- Requester向 Completer发起存储器读请求总线事务;
- 这个请求事务在到达 Completer之前,可能会经过多级PCI桥。这些PCI桥使用 Split response周期结束当前总线事务,释放上游PC总线,之后继续转发这个存储器读请求,直到 Completer认领这个存储器读请求事务。
- completer认领存储器读请求总线事务后,会记录 Requester的D号,并使用 Split Response 周期结束存储器读请求总线事务。
- Completer准备好数据后,将重新申请总线,并使用存储器读完成总线事务主动将数据传送给 Requester。在这个报文中包含 Requester的号(完成报文使用的是ID路由)。
- 这些完成报文根据ID路由方式,最终到达 Requester。 Requester从完成报文中接收数据并完成整个存储器读请求。
Split传输可以看成是将请求和完成分开,分别使用Posted方式进行的传输。
Posted与Non-Posted总线事务是PCIe的基础,PCI Express相关知识总结会持续更新哦,有需要的关注公众号的后续文章,咱们一起学习~~
关注公众号【两猿社】,回复【PCIE】获取PCI-SIG原版PCI Express标准2.0~4.0。
了解PCI Express的Posted传输与Non-Posted传输的更多相关文章
- PCI Express(二) - Topology
原文出处:http://www.fpga4fun.com/PCI-Express2.html Point-to-point architecture At 2.5Gbps, the PCI Expre ...
- PCI Express(一)- Connector
在FPGA4FUN上看到一篇介绍PCI-E的帖子,简单易懂,适合入门,特地搬过来 原文地址:http://www.fpga4fun.com/PCI-Express.html 前言: As PCI Ex ...
- Down to the TLP: How PCI express devices talk (Part II)
http://xillybus.com/tutorials/pci-express-tlp-pcie-primer-tutorial-guide-2 Data Link Layer Packets A ...
- Down to the TLP: How PCI express devices talk (Part I)
http://xillybus.com/tutorials/pci-express-tlp-pcie-primer-tutorial-guide-1 Down to the TLP: How PCI ...
- [中英对照]How PCI Express Works | PCIe工作原理
How PCI Express Works | PCIe工作原理 PCI Express is a high-speed serial connection that operates more li ...
- GPIB、USB、PCI、PCI Express和以太网/LAN/LXI
GPIB 我们研究的第一个总线是IEEE 488总线,较为熟悉的称谓是GPIB(通用接口总线).GPIB是一种在业界已经得到证明的专为仪器控制应用设计的总线.GPIB在过去30年来一直是鲁棒的.可靠的 ...
- PCI Express
1.1课题研究背景 在目前高速发展的计算机平台上,应用软件的开发越来越依赖于硬件平台,尤其是随着大数据.云计算的提出,人们对计算机在各个领域的性能有更高的需求.日常生活中的视频和图像信息包含大量的数据 ...
- PCI Express(六) - Simple transactions
原文地址:http://www.fpga4fun.com/PCI-Express6.html Let's try to control LEDs from the PCI Express bus. X ...
- PCI Express(五) - Xilinx wizard
原文地址:http://www.fpga4fun.com/PCI-Express5.html Xilinx makes using PCI express easy - they provide a ...
随机推荐
- MVC04
1. 从页面到action 讲述controller与View之间的具体运作关系 在上次添加的名为Movie的Model内添加 下面我们尝试为该model内的属性添加attribute 具体修改如下: ...
- Typora[MarkDown编辑器]+(PicGo+Github+JsDelivr)[个人图床] ,开启你的高效创作
使用Typora搭配Picgo开启你的高效创作 0x00 一切都要从MarkDown说起 富文本语言的弊端 平常我们最常用的写作工具,无非是富文本编辑器中的代表--微软家的Office Word.这种 ...
- json中存整形数值,前端返回为空
实现目标: 在servlet中将整型数值转为json,然后在前端获取 问题描述: 前端获取为空,显示为:console.log打印为:{} 解决办法: 在servlet中将数值转为json格式再进行传 ...
- django使用户名和邮箱都能登录
为了能够让邮箱也能登录,需要重新定义认证功能,需要把email添加成username用于认证 定义的class继承ModelBackend,使用Q方法并集 然后在settings.py里面添加 这样既 ...
- GO系列 | 5分钟入门GO【译】
什么是Google Go? Google Go是由Robert Griesmer,Rob Pike和Ken Thompson在Google设计的一种开源编程语言. Go在语法上类似于C语言: 除了内存 ...
- table 上下左右 4根线的写法 :before :after 他们就能把td里面右下的那颗线给盖上 还有body和header横向滚动的联动 || 不能把body套在header上是为了上header表头固定 || 还有表头header的右侧overflow-y 是否出现滚动条的位置 记得有一个$nextTick 要不然会获取不到高度 高度就为0了 || 横向滚动条纵向滚动条
table 上下左右 4根线的写法 <!--* @description 重点查核人员表!--><template> <div class="keyChecke ...
- 数据库事务ACID详解(转载)
转载自:http://blog.csdn.net/shuaihj/article/details/14163713 谈谈数据库的ACID 一.事务 定义:所谓事务,它是一个操作序列,这些操作要么都执行 ...
- Python下载各种功能包出问题
问题详情 点击之后出现 AttributeError: module 'importlib._bootstrap' has no attribute 'SourceFileLoader' 解决方法 c ...
- Kafka的面试题
1.Kafka的设计是什么样的呢?Kafka将消息以topic为单位进行归纳将向Kafka topic发布消息的程序成为producers.将预订topics并消费消息的程序成为consumer.Ka ...
- Journal of Proteome Research | 人类牙槽骨蛋白的蛋白质组学和n端分析:改进的蛋白质提取方法和LysargiNase消化策略增加了蛋白质组的覆盖率和缺失蛋白的识别 | (解读人:卜繁宇)
文献名:Proteomic and N-Terminomic TAILS Analyses of Human Alveolar Bone Proteins: Improved Protein Extr ...