PCIe总线的通信机制:当一个设备要想另一个设备进行读取通信时,请求方requester需要向另一个设备发送请求request,靶向方作为事件完成方completer,以complete Packet的形式返回数据或者错误信息。请求的形式有:内存(memory)、输入输出(IO),配置(Configuration)和消息(Message)

non-posted和posted的区别是是否仅仅将数据发送到接收方就完成动作,non_posted是指请求方发送了一个包含请求的Packet之后,还要得到一个包含completion的Packet的应答,posted指的是发出请求后,不需要completer发送一个包进行应答。显然,posted类型的操作对总线的利用效率更高。

事务层包(Transaction Layer Packet,TLP)的几种类型:

abbreviated :缩写

TLP的传输层示意图:

图中的示意图以发送和接收为例,用户层将数据发送到事务层,事务层给数据加上帧头,并在数据的结尾添加ECRC(端到端CRC校验)信息,再发送给数据链路层(Data Link Layer),护具链路层给接收到的TLP添加网络封包序号和数据链路层CRC校验结果,之后将数据发送到物理层,物理层给接收到的报添加其实和结束标志。

接收方反向操作。

事务层包的结构图为:

图中的TLP Digest即ECRC(End-to-End CRC),是可选项。此外,TLP的长度(包括其中的Header、Data和ECRC)是以DW(double word双字,即四个字节byte)为单位。

带回答的数据传输non-posted,包括Ordinary Read(正常读取)、Locked Read(锁存读取)、IO/Configuration Write(IO端口、配置写入),不带回应的传输为Memory Writes和Message Writes。

1、在Ordinary read(non_posted)时,终端endpoint向system memory系统内存空间发送读取请求(Read Request)

终端的读请求经过两个切换之后进入root,然后root对读请求的包packet进行解码,从解码结果中识别出操作地址,再向操作地址进行读取,将包含数据的completion packet(cplD包)发送到Endpoint。PCIe允许每个包的最大数据量(Max Data Payload)为4KB,但是实际上往往采用更小的Size(128,256,512,1024,2048)。因此,往往一个读请求对应多个ClpD,将大于设定的Size的数据分成多个包进行分包发送。此外,在root将数据发送给请求端方式根据请求数据中的BDF(Bus,device,Function)信息查找对应的endpoint设备.

2、对于posted-write

PCIe中的写操作都是posted的,因此请求方不需要完成方的Copletion信息,写请求有处理器Processor发出,Root接收到写请求指令后将数据通过写入信息通过switch写入到endpoint。由于没有返回Completion,在发生错误时,请求方不知道错误的发生。但是完成方completer会将错误记录到日志(log),然后向root发送报错记录的Message。

 关于事务层传输的优先级问题

考虑到一些传输对时间要求的问题,保证这一类数据包的优先发送,PCIe标准中为每一个包都分配了一个优先级,通过事务层包的Header中的TC【2:0】进行区别,(Traffic Class,传输等级),TC越大,传输优先级越高,对应的包也会优先发送。通常支持QoS(Quallition of Service)的PCIe总线系统,对于每一个Tc值都会有一个独立的VC(虚拟通道,viatual channel)相对应,VC就是一个buffer缓存,作用是缓存数据包。

在switch端,switch根据优先级进行包传输,即为端口仲裁(Arbitrition of Port),

PCIe事务层の详解(一)的更多相关文章

  1. (转)Spring事务管理详解

    背景:之前一直在学习数据库中的相关事务,而忽略了spring中的事务配置,在阿里面试时候基本是惨败,这里做一个总结. 可能是最漂亮的Spring事务管理详解 https://github.com/Sn ...

  2. 【Spring】——声明式事务配置详解

    项目中用到了spring的事务: @Transactional(rollbackFor = Exception.class, transactionManager = "zebraTrans ...

  3. 可能是最漂亮的Spring事务管理详解

    Java面试通关手册(Java学习指南):https://github.com/Snailclimb/Java_Guide 微信阅读地址链接:可能是最漂亮的Spring事务管理详解 事务概念回顾 什么 ...

  4. 可能是最漂亮的Spring事务管理详解 专题

    微信阅读地址链接:可能是最漂亮的Spring事务管理详解 事务概念回顾 什么是事务? 事务是逻辑上的一组操作,要么都执行,要么都不执行. 事物的特性(ACID): 原子性: 事务是最小的执行单位,不允 ...

  5. 最漂亮的Spring事务管理详解

    SnailClimb 2018年05月21日阅读 7245 可能是最漂亮的Spring事务管理详解 Java面试通关手册(Java学习指南):github.com/Snailclimb/- 微信阅读地 ...

  6. Net Core中数据库事务隔离详解——以Dapper和Mysql为例

    Net Core中数据库事务隔离详解--以Dapper和Mysql为例 事务隔离级别 准备工作 Read uncommitted 读未提交 Read committed 读取提交内容 Repeatab ...

  7. Redis的事务功能详解

    Redis的事务功能详解 MULTI.EXEC.DISCARD和WATCH命令是Redis事务功能的基础.Redis事务允许在一次单独的步骤中执行一组命令,并且可以保证如下两个重要事项: >Re ...

  8. spring事务管理(详解和实例)

    原文地址: 参考地址:https://blog.csdn.net/yuanlaishini2010/article/details/45792069 写这篇博客之前我首先读了<Spring in ...

  9. SpringBoot事务注解详解

    @Transactional spring 事务注解 1.简单开启事务管理 @EnableTransactionManagement // 启注解事务管理,等同于xml配置方式的 <tx:ann ...

随机推荐

  1. 小程序获取Unionid

    小程序获取用户Unionid,必须授权获取密文.但授权成功后不是永久的.除非关注了公众号或者App微信绑定了, 解决办法是通过code获取openid,然后用openid去数据库查对应的Unionid ...

  2. CDOJ 1063 堆排序模板

    D - 秋实大哥与妹纸 Time Limit:1000MS     Memory Limit:1500KB     64bit IO Format:%lld & %llu Submit Sta ...

  3. 【Dart学习】-- Dart之消息循环机制[翻译]

    概述 异步任务在Dart中随处可见,例如许多库的方法调用都会返回Future对象来实现异步处理,我们也可以注册Handler来响应一些事件,如:鼠标点击事件,I/O流结束和定时器到期. 这篇文章主要介 ...

  4. python3学习笔记(三):注释和字符串

    一.注释 为了让别人能够更容易理解程序,使用注释是非常有效的,即使是自己回头再看旧代码也是一样. # 打印圆的周长: print(2* pi* r) 在python 中用井号(#)表示注释.井号(#) ...

  5. Spring Cloud架构教程 (三)服务网关(基础)

    通过之前几篇Spring Cloud中几个核心组件的介绍,我们已经可以构建一个简略的(不够完善)微服务架构了.比如下图所示: alt 我们使用Spring Cloud Netflix中的Eureka实 ...

  6. 最全的Android开发资源整理--进阶必备

    原文链接: http://stormzhang.github.io/android/2014/06/05/android-awesome-resources/ (友情提醒:最近google的很多服务被 ...

  7. Vue 中 双向绑定数据

    1.文本 <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <titl ...

  8. linux 目录介绍

    /boot: 系统启动相关的文件,如内核.initrd,以及grub(bootloader)/dev: 设备文件 /etc:配置文件/home:用户的家目录,每一个用户的家目录通常默认为/home/U ...

  9. PHP操作json

    输出json文件中文处理 <?php $json_array = array(); // 1.转换为json字符串(不自动转换为unicode编码) if (version_compare(PH ...

  10. freemarker程序开发

    1.程序开发入门 1.1 创建配置实例 首先,你应该创建一个freemarker.template.Configuration的实例,然后调整它的设置.Configuration实例是存储FreeMa ...