了解PCI Express的Posted传输与Non-Posted传输

2024-04-29 02:38

本文主要是介绍了解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总线的处理器系统
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向主存储器写数据:
DMA写(Posted传输)

  1. 首先PC设备11将主存储器写请求发向PCI总线x1,注意这个写请求使用的地址是PCI总线域的地址。
  1. PCI总线x1上的所有设备监听这个请求,因为PCI设备11是向处理器的存储器写数据,所以PCI总线x1上的 PCI Agent都不会接收这个数据请求。
  1. PCI桥x1发现当前总线事务使用的PCI总线地址不是其下游设备使用的PCI总线地址,则接收这个请求,并结束来自PCI设备11的 Posted存储器写请求,将这个数据请求推到上游PCI总线上,即PCI总线x0。
  1. PCI总线x0上的所有设备包括HOST主桥将监听这个请求,PCI总线x0上的PCI设备也不会接收这个请求,此时这个数据请求由HOST主桥x接收,并结束PCI桥x1的Posted存储器写请求。
  1. 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向主存储器读数据:
DMA读(Non-Posted传输)

  1. 首先PCI设备11将存储器读请求发向PCI总线x1。
  1. PCI总线x1上的所有设备监听这个请求,因为PCI设备11是从存储器中读取数据,所以PCI总线x1上的设备不会接收这个请求。PCI桥x1发现下游PCI总线没有设备接收,则接收这个数据请求,并将它推到上游PCI总线上,即PCI总线x0上。
  1. PCI总线x0上的设备监听这个请求,也不会接受这个数据请求,最后这个数据请求被HOST主桥x接收。
  1. HOST主桥发现这个数据请求是发向主存储器的,则将PCI总线x0的PCI总线地址转为存储器地址,之后通过控制器将数据读出,带着读完成信息转发到HOST主桥x。
  1. 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)进行数据交换,步骤如下:

  1. Requester向 Completer发起存储器读请求总线事务;
  1. 这个请求事务在到达 Completer之前,可能会经过多级PCI桥。这些PCI桥使用 Split response周期结束当前总线事务,释放上游PC总线,之后继续转发这个存储器读请求,直到 Completer认领这个存储器读请求事务。
  1. completer认领存储器读请求总线事务后,会记录 Requester的D号,并使用 Split Response 周期结束存储器读请求总线事务。
  1. Completer准备好数据后,将重新申请总线,并使用存储器读完成总线事务主动将数据传送给 Requester。在这个报文中包含 Requester的号(完成报文使用的是ID路由)。
  1. 这些完成报文根据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传输的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/944916

相关文章

关于数据埋点,你需要了解这些基本知识

产品汪每天都在和数据打交道,你知道数据来自哪里吗? 移动app端内的用户行为数据大多来自埋点,了解一些埋点知识,能和数据分析师、技术侃大山,参与到前期的数据采集,更重要是让最终的埋点数据能为我所用,否则可怜巴巴等上几个月是常有的事。   埋点类型 根据埋点方式,可以区分为: 手动埋点半自动埋点全自动埋点 秉承“任何事物都有两面性”的道理:自动程度高的,能解决通用统计,便于统一化管理,但个性化定

速了解MySQL 数据库不同存储引擎

快速了解MySQL 数据库不同存储引擎 MySQL 提供了多种存储引擎,每种存储引擎都有其特定的特性和适用场景。了解这些存储引擎的特性,有助于在设计数据库时做出合理的选择。以下是 MySQL 中几种常用存储引擎的详细介绍。 1. InnoDB 特点: 事务支持:InnoDB 是一个支持 ACID(原子性、一致性、隔离性、持久性)事务的存储引擎。行级锁:使用行级锁来提高并发性,减少锁竞争

PHP: 深入了解一致性哈希

前言 随着memcache、redis以及其它一些内存K/V数据库的流行,一致性哈希也越来越被开发者所了解。因为这些内存K/V数据库大多不提供分布式支持(本文以redis为例),所以如果要提供多台redis server来提供服务的话,就需要解决如何将数据分散到redis server,并且在增减redis server时如何最大化的不令数据重新分布,这将是本文讨论的范畴。 取模算法 取模运

Weex入门教程之1,了解Weex

【资料合集】Weex Conf回顾集锦:讲义PDF+活动视频! PDF分享:链接:http://pan.baidu.com/s/1hr8RniG 密码:fa3j 官方教程:https://weex-project.io/cn/v-0.10/guide/index.html 用意 主要是介绍Weex,并未涉及开发方面,好让我们开始开发之前充分地了解Weex到底是个什么。 以下描述主要摘取于

Java了解相对较多!

我是对Java了解相对较多,而对C#则是因工作需要才去看了一下,C#跟Java在语法上非常相似,而最初让我比较困惑的就是委托、事件部分,相信大多数初学者也有类似的困惑。经过跟Java的对比学习,发现这其实跟Java的监听、事件是等同的,只是表述上不同罢了。   委托+事件是观察者模式的一个典型例子,所谓的委托其实就是观察者,它会关心某种事件,一旦这种事件被触发,这个观察者就会行动。   下

使用WebP解决网站加载速度问题,这些细节你需要了解

说到网页的图片格式,大家最常想到的可能是JPEG、PNG,毕竟这些老牌格式陪伴我们这么多年。然而,近几年,有一个格式悄悄崭露头角,那就是WebP。很多人可能听说过,但到底它好在哪?你的网站或者项目是不是也应该用WebP呢?别着急,今天咱们就来好好聊聊WebP这个图片格式的前世今生,以及它值不值得你花时间去用。 为什么会有WebP? 你有没有遇到过这样的情况?网页加载特别慢,尤其是那

初步了解VTK装配体

VTK还不太了解,根据资料, vtk.vtkAssembly 是 VTK库中的一个重要类,允许通过将多个vtkActor对象组合在一起来创建复杂的3D模型。 import vtkimport mathfrom vtk.util.colors import *filenames = ["cylinder.stl","sphere.stl","torus.stl"]dt = 1.0renW

Nodejs的Express框架使用总结

初始安装express,你也可以通过编辑器的shell安装依赖,比如vs # 创建并切换到 myapp 目录mkdir myappcd myapp# 初始化 package.json 文件npm init -y# 安装 express 到项目中npm i express 新建一个基础的接口 // 0. 加载 Expressconst express = require('expre

Post-Training有多重要?一文带你了解全部细节

1. 简介 随着LLM学界和工业界日新月异的发展,不仅预训练所用的算力和数据正在疯狂内卷,后训练(post-training)的对齐和微调方法也在不断更新。InstructGPT、WebGPT等较早发布的模型使用标准RLHF方法,其中的数据管理风格和规模似乎已经过时。近来,Meta、谷歌和英伟达等AI巨头纷纷发布开源模型,附带发布详尽的论文或报告,包括Llama 3.1、Nemotron 340

了解elementUI的底层源码, 进行二次开发

Element UI 是一个基于 Vue.js 的桌面端组件库,广泛用于构建美观、交互友好的用户界面。要深入理解 Element UI 的底层源码并进行二次开发,你需要掌握以下几个关键点: Vue.js 原理 Element UI 是基于 Vue.js 构建的,因此首先需要熟悉 Vue.js 的核心概念和机制,包括: ● 组件系统:Vue.js 的组件化思想,如何定义组件、使用组件、传递属性和事