当前位置: 首页 > news >正文

PCIe系列专题之二:2.1 TLP的前世今生

一、故事前传

之前我们讲了对PCIe的一些基础概念作了一个宏观的介绍,了解了PCIe是一种封装分层协议(packet-based layered protocol),主要包括事务层(Transaction layer), 数据链路层(Data link layer)和物理层(Physical layer)。

较为详细解释请见之前的文章:

1. PCIe技术概述;

2.0 PCIe Transaction layer事务层概述。

二、事务层TLP的前世今生

PCIe总线使用的数据报文首先在事务层中形成,这个数据报文也被称之为事务层数据报文,即TLP(Transaction Layer Packet),TLP在经过数据链路层时被加上Sequence Number前缀和CRC后缀,然后发向物理层。

生活中,有时,我们会陷入一个哲学性的思考: "我们来自哪里,终归何方?" 同样,TLP也有这个命题的解答。TLP来自发送设备的事务层,历经“磨难”,终归接收端的事务层。

那么,在TLP传递的过程中到底经历哪些“磨难”呢?请看下图~

我们逐层解析一下这些“磨难”:

1. 发送端Device Core发送事务请求: 数据读写, 完成反馈(Completions),信息(Message)等;

2. 事务层根据Device Core的请求,生成TLP Header,加上Device Core提供的data, 最后加上ECRC(End to End CRC)。此时TLP会放入事务层缓存(Virtual Channel Buffer)之中;

3. 当TLP传递至数据链路层时,会被加上Squeeze Number以及LCRC(Link CRC)。此时,生成"加强版"TLP,并放入数据链路层的Retry buffer;

4. 当TLP传至物理层时,被加上头和尾,到这里,TLP在发送端就组装完毕咯;

5. 在接收端就跟发送端做的事情相反了,在物理层需要掐头去尾,然后传输至数据链路层;

6. 数据链路层收到传入的TLP后,通过计算LCRC验证传输是否正确,正确的话就去掉Sequence Number和LCRC,将TLP传输至事务层;

7. 事务层接收到TLP之后,解析其内容,并将信息传给接收端Device Core,至此,发送端传过来的组装TLP已拆解完毕。

相关文章:

  • 【面经】HTTP篇
  • web自动化测试(selenium.webdriver)
  • grpc和protobuf在一起
  • 1. HelmTemplate 3分钟将项目打包成Helm Chart并部署至k8s
  • 【Shell】算术运算符、流程控制、函数使用、数组以及加载其它文件的变量
  • Redis 备份恢复(持久化)手册
  • 【Linux】01-Linux系统CentOS7虚拟机VMware安装保姆级教程
  • Go语言各种扩容机制(防止混淆)
  • Pytorch深度学习——线性回归实现 04(未完)
  • 虚拟内存、锁页内存、内存分页、分段、段页式内存管理(超详细)
  • 【BOOST C++】教程4:常量和宏
  • 不可以涩涩!AI续写软件初体验;迁移学习路线图;谷歌新闻非官方搜索API;CS295『因果推理』2021课程资料;前沿论文 | ShowMeAI资讯日报
  • 高项_第十四章信息文档管理与配置管理
  • 07 nginx 的 worker process 的调试
  • 时间序列预测:用电量预测 04 Std_Linear(多元线性回归算法 数据标准化)
  • JS 中的深拷贝与浅拷贝
  • [微信小程序] 使用ES6特性Class后出现编译异常
  • 【翻译】babel对TC39装饰器草案的实现
  • 4个实用的微服务测试策略
  • Android 架构优化~MVP 架构改造
  • angular2开源库收集
  • emacs初体验
  • markdown编辑器简评
  • Mysql数据库的条件查询语句
  • Nginx 通过 Lua + Redis 实现动态封禁 IP
  • node和express搭建代理服务器(源码)
  • python docx文档转html页面
  • Python_网络编程
  • spring学习第二天
  • tensorflow学习笔记3——MNIST应用篇
  • 爱情 北京女病人
  • 分布式任务队列Celery
  • 理解在java “”i=i++;”所发生的事情
  • 模仿 Go Sort 排序接口实现的自定义排序
  • 七牛云假注销小指南
  • 小程序开发中的那些坑
  • 学习笔记:对象,原型和继承(1)
  • 一天一个设计模式之JS实现——适配器模式
  • ​io --- 处理流的核心工具​
  • ​Linux Ubuntu环境下使用docker构建spark运行环境(超级详细)
  • ​软考-高级-信息系统项目管理师教程 第四版【第14章-项目沟通管理-思维导图】​
  • ​一文看懂数据清洗:缺失值、异常值和重复值的处理
  • #define,static,const,三种常量的区别
  • #if 1...#endif
  • #鸿蒙生态创新中心#揭幕仪式在深圳湾科技生态园举行
  • (C++17) optional的使用
  • (PHP)设置修改 Apache 文件根目录 (Document Root)(转帖)
  • (PWM呼吸灯)合泰开发板HT66F2390-----点灯大师
  • (深入.Net平台的软件系统分层开发).第一章.上机练习.20170424
  • (四)TensorRT | 基于 GPU 端的 Python 推理
  • (学习日记)2024.01.19
  • (原)本想说脏话,奈何已放下
  • (转)程序员技术练级攻略
  • (状压dp)uva 10817 Headmaster's Headache
  • **登录+JWT+异常处理+拦截器+ThreadLocal-开发思想与代码实现**