PCIe协议之-TLP路由基础
✨前言:
在PCI Express (PCIe) 技术中,数据包的路由方式对于确保信息能够高效、准确地传送至目标设备至关重要。PCIe定义了几种路由方式,主要有以下几种。
🌟地址路由(Address Based Routing)
这是最基本的路由方式,PCIe设备利用目的地址信息来决定数据包的路由路径。目的地址通常包括目标设备的总线号、设备号和功能号。在经过每一个交换节点时,基于这些信息来决定数据包是向下一个交换节点转发,还是到达了最终目标。
🌟ID路由(ID Based Routing)
在这种路由方式中,每个PCIe设备或端点都有一个唯一的ID,这个ID在数据包中用于识别目标设备。这种方式常用于结束点到结束点的直接信号传输,在多点传输场景下,尤其是在那些具有复杂拓扑结构的系统中,ID路由可以非常有效。
🌟隐式路由(Implicit Routing)
这种路由方式主要用于处理某些特定类型的数据包,如功率管理事件或热管理事件。这些数据包不需要明确的目标地址,因为它们通常由系统中的所有设备或者由特定处理这类事件的设备处理。隐式路由依赖于系统硬件和固件的内建规则来正确地处理和转发这些数据包。
具体采用哪一种路由方式是由TLP的类型所决定的,如下表所示:
📌注:AtomicOp是PCIe Spec V2.1新增的内容,有兴趣的可以自行阅读V2.1的相关内容。
📌注:一般情况下,Message都是使用模糊路由(Implicitly Routing)的,但是也有PCIe设备厂商自定义的Message会使用地址路由或者ID路由。
可能有的人要有疑惑了,既然Message可以使用地址路由或者ID路由,为什么还要单独搞出来一个模糊路由呢?原因很简单,使用模糊路由可以广播Message到每一个设备,采用其他的路由方式必须明确指定是哪一个设备。
那么PCIe中是如何来判断TLP的类型的呢?又是如何判断其为Request还是Completion的呢?实际上是通过TLP Header的Format和Type部分来确定的,如下图所示:
在PCI Express (PCIe) 架构中,事务层数据包(Transaction Layer Packets, TLPs)是数据通信的基本单位。TLPs用于在设备间传输数据、内存读写请求以及控制信息。TLP的类型、是否为请求(Request)还是完成(Completion)报文等,都通过TLP的头部信息来识别。
⭐️TLP头部信息
TLP头部包含了多个字段,其中一些关键字段用于指示TLP的类型以及它是请求还是完成报文:
格式(Format):指示TLP头部的长度和布局,不同类型的TLPs(如内存读/写、I/O读/写、配置读/写等)会使用不同的头部格式。
类型(Type):这是一个关键字段,它直接指示了TLP是什么类型的数据包。例如,内存读请求、内存写请求、I/O读写请求、配置读写请求或者是完成报文(用于响应之前的某个请求)。
请求者ID(Requester ID):在请求TLPs中,这个字段指示了发起请求的设备。 目的ID(Destination ID):在完成TLPs中,这个字段用于指示响应应当发送到哪个设备。
⭐️区分请求和完成
通过类型(Type)字段区分:TLP头部中的类型字段是区分TLP是请求还是完成报文的关键依据。例如,内存读请求和内存写请求被明确标记为请求类型,而完成报文则有其特定的标识符来指明是作为之前某个请求的响应。
格式字段辅助判断:虽然格式字段主要描述的是头部的大小和布局,但通过它与类型字段的组合,可以更确切地识别TLP的具体类型和性质。
下面就跟着我来详细了解一下这三种路由
✨一、ID Routing
ID 路由(ID Routing)有的时候也被称为BDF路由,即采用Bus Number、Device Number和Function Number来确定目标设备的位置。这是一种兼容PCI和PCI-X总线协议的路由方式,主要用于配置请求(Configuration Request)的路由,在PCIe总线中,其还可以被用于Completion和Message的路由。
TLP的Header有3DW的和4DW的,其中4DW的Header一般只用于Message中。使用ID路由的TLP Header以下两张图所示,第一个为3DW Header,第二个为4DW Header:
对于Endpoint来说,其只需要检查TLP Header中的BDF是否与自己的BDF一致,如果一致,则认为是发送给自己的,否则便会忽略该TLP。
📌注:采用ID路由的TLP Header中并未包含Requester的ID(BDF),那么Completer怎么确定Requester的位置呢?实际上这个问题并不难回答,因为ID路由主要用于配置请求和Completion,偶尔也用于一些厂商自定义的Message。首先,配置请求的Requester只能是Root,所以不需要确定其位置;再之,Completion用于对其他路由方式的回应,如地址路由中包含了Requester的BDF;最后,Message是Posted型的,即其根本不需要Completion,自然也就不需要Requester的BDF了。
📌注:实际上PCIe是一种点对点(Point-to-Point)的通信方式,即每个链路只能连接一个设备,因此大部分情况下使用5bit的空间来描述Device Number完全是多余的。为此,PCIe Spec提出了ARI格式,这里暂时不详细介绍了,有兴趣的可以自行阅读PCIe Spec的相关内容。
对于Switch来说,则需要根据TLP Header中的BDF来判断,这个TLP是给自己的还是给自己下属的其他设备的。如下图所示:
🌟请求者ID的作用
请求者ID(Requester ID)是一个重要字段,用于标识发起TLP请求的设备。在PCIe中,每个设备拥有一个唯一的ID,称为Bus/Device/Function(BDF)编号。这个ID确保了即使在复杂的系统拓扑中,完成者也能够确定并发送响应到正确的请求者。
🌟TLP中的请求者ID
对于请求TLP,无论是用于读操作还是写操作,头部中都会包含请求者ID字段。这个字段确保了,当完成者完成操作并需要发回完成(Completion)TLP时,知道将响应发送至何处。
对于完成TLP,头部包含的是完成者ID(Completer ID),这是因为响应需要标识出是哪个设备完成了操作。同时,完成TLP还包含了一个标签(TAG)字段,这个标签在请求时由请求者生成,并由完成者在生成完成TLP时复制过去,这样请求者就可以匹配响应到它原始的请求。
✨二、Address Routing
地址路由(Address Routing)的地址包括IO和Memory。对于Memory请求来说,32bit的地址使用3DW的Header,64bit的地址使用4DW的Header。而IO请求则只能使用32bit的地址,即只能使用3DW的Header。
注:再次强调,IO请求是为了兼容早期的PCI设备的,在新的PCIe设备中禁止使用。
3DW和4DW的TLP Header分别如以下两张图所示:
当Endpoint接收到采用地址路由的TLP时,其会根据该TLP Header中的地址信息和自己的配置空间中的BAR寄存器来判断这个TLP是不是自己的。如下图所示:
Switch的地址路由机制如下图所示:
✨三、Implicit Routing
模糊路由(Implicit Routing,又译为隐式路由)只能用于Message的路由。PCIe总线相对于PCI总线的一大改进便是消除了大量的边带信号,这正是通过Message的机制来实现的。
PCIe定义的Message主要有以下几种类型:
1.Power Management(电源管理): 这类消息用于管理设备的电源状态,比如将设备置于不同的睡眠状态(L1, L2等),或者唤醒设备。这对于节能和热管理非常关键。
2.INTx Legacy Interrupt Signaling(INTx传统中断信号): 尽管PCIe设备推荐使用基于消息的中断(MSI或MSI-X),但为了向后兼容,PCIe也支持通过特殊消息来模拟传统的PCI中断线(INTA,
INTB, INTC, INTD)。
3.Error Signaling(错误信号): PCIe设备和交换机可以通过发送特定的错误消息来报告诸如不可纠正错误、可纠正错误等问题。这些消息对于确保系统稳定运行和及时诊断故障至关重要。
4.Locked Transaction Support(锁定事务支持): 用于支持特定类型的原子操作,在确保数据一致性和事务的原子性方面非常重要。
5.Hot Plug Signaling(热插拔信号): 这类消息支持系统动态地检测和配置新增或移除的设备,比如在不需要关闭电源的情况下添加或移除扩展卡。
6.Vendor‐Specific Signaling(厂商特定信号): 这使得厂商可以定义自己特定的消息类型进行通信和控制,为设备制造商提供了设计灵活性。
7.Slot Power Limit Settings(插槽功率限制设置): 用于传递有关插槽可提供给插入设备的最大功率限制的信息,有助于电源管理和避免过载。
所有采用模糊路由的TLP的Header都是4DW的,具体如下图所示:
其中Type决定了模糊路由的类型,具体如下图所示:
000b: 路由到RC
001b:使用地址路由
010b: 使用ID路由
011b:来自RC的广播报文
100b:本地消息,在接收端结束(legacy中断消息使用这种报恩格式,传递来自PCI总线的中断报文)。
101b:用于PCIe电源管理(PME_TO_Ack报文使用)
110b-111b:保留字段
当一个Endpoint收到一个Message TLP,检查TLP Header,如果是RC的广播Message(011b)或者该Message终结于它(100b),它就接受该Message。当一个Switch收到一个Message TLP,检查TLP Header,如果是RC的广播Message(011b),则往它每个下游端口复制该Message然后转发。如果该Message终结于它(100b),则接受该TLP。如果下游端口收到发给RC的Message,则往上游端口转发。
相关文章:

PCIe协议之-TLP路由基础
✨前言: 在PCI Express (PCIe) 技术中,数据包的路由方式对于确保信息能够高效、准确地传送至目标设备至关重要。PCIe定义了几种路由方式,主要有以下几种。 🌟地址路由(Address Based Routing) 这是最基本…...
inline内联函数-虚函数(virtual)可以是内联函数(inline)吗?
目录标题 inline内联函数特征:使用:编译器对inline函数的处理步骤优点:缺点: 虚函数(virtual)可以是内联函数(inline)吗?特征:使用: inline内联函…...

Spring Boot | Spring Boot 消息管理 ( 消息中间件 ) 、RabbitMQ“消息中间件“
目录: 一、"消息服务" 概述 :1.1 为什么要使用 "消息服务" ( 消息中间件 ) ?① 异步处理② 应用解耦③ 流量削峰④ 分布式事务管理 1.2 常用 "消息中间件" 介绍 :ActiveMQ ( 广泛应用于中小型企业 )RabbitMQ ( 没有特别要求的场景下…...

二层交换机与路由器连通上网实验
华为二层交换机与路由器连通上网实验 二层交换机是一种网络设备,用于在局域网(LAN)中转发数据帧。它工作在OSI模型的第二层,即数据链路层。二层交换机通过学习和维护MAC地址表,实现了数据的快速转发和广播域的隔离。 实…...

AJAX知识点(前后端交互技术)
原生AJAX AJAX全称为Asynchronous JavaScript And XML,就是异步的JS和XML,通过AJAX可以在浏览器中向服务器发送异步请求,最大的优势:无需刷新就可获取数据。 AJAX不是新的编程语言,而是一种将现有的标准组合在一起使用的新方式 …...
用wordpress为外贸进出口公司搭建多语言国际站
使用WordPress为外贸进出口公司搭建多语言国际站是一个很好的选择,因为WordPress不仅易于使用,而且具有丰富的插件和主题,可以支持多语言内容。以下是搭建多语言国际站的步骤和建议: 安装WordPress:首先,您…...
雷军-2022.8小米创业思考-6-互联网七字诀之口碑:口碑即定位,超预期才有口碑,品牌建设
第六章 互联网七字诀 专注、极致、口碑、快,这就是我总结的互联网七字诀,也是我对互联网思维的高度概括。 口碑 用户口碑是所有产品成功的关键因素,这是不言而喻的公理。 资源永远有限,对于创业公司尤其如此。只有专注…...
欧盟MDR法规对医疗器械网络安全都有哪些要求?
MDR,欧盟医疗器械法规(Medical Device REGULATION (EU) 2017/745,简称“MDR”),当医疗器械办理欧盟CE认证时,需满足新法规 MDR (EU) 2017/745要求。 M DR符合性评估 医械网络安全咨询与相关文件出具&#x…...

Linux —— 信号初识
Linux —— 信号初识 什么是信号测试几个信号signal函数函数原型参数说明返回值注意事项示例 后台程序前台转后台检测输入中断向量表 我们今天来继续学习Linux的内容,今天我们要了解的是Linux操作系统中的信号: 什么是信号 信号是操作系统内核与进程之…...
webpack进阶 -- 自定义Plugin,Loader封装打包优化
介绍 Webpack 是一个现代 JavaScript 应用程序的静态模块打包器(module bundler)。在 Webpack 处理应用程序时,它会在内部构建一个依赖图(dependency graph),这个依赖图对应映射到项目所需的每个模块,并生成一个或多个 bundle。在这个过程中…...

《Decoupled Optimisation for Long-Tailed Visual Recognition》阅读笔记
论文标题 《Decoupled Optimisation for Long-Tailed Visual Recognition》 长尾视觉识别的解耦优化 作者 Cong Cong、Shiyu Xuan、Sidong Liu、Shiliang Zhang、Maurice Pagnucco 和 Yang Song、 来自新南威尔士大学计算机科学与工程学院、北京大学计算机学院多媒体信息处…...

Springboot+Vue项目-基于Java+MySQL的毕业就业信息管理系统(附源码+演示视频+LW)
大家好!我是程序猿老A,感谢您阅读本文,欢迎一键三连哦。 💞当前专栏:Java毕业设计 精彩专栏推荐👇🏻👇🏻👇🏻 🎀 Python毕业设计 &…...

条件平差——以水准网平差为例 (python详细过程版)
目录 一、原理概述二、案例分析三、代码实现四、结果展示本文由CSDN点云侠原创,原文链接。如果你不是在点云侠的博客中看到该文章,那么此处便是不要脸的爬虫与GPT。 一、原理概述 条件平差的函数模型和随机模型为: A V + W = 0...
mysql -- WITH RECURSIVE 语法
引言 在 SQL 中,WITH RECURSIVE 是一个用于创建递归查询的语句。它允许你定义一个 Common Table Expression (CTE),该 CTE 可以引用自身的输出。递归 CTE 非常适合于查询具有层次结构或树状结构的数据,例如组织结构、文件系统或任何其他具有…...

洗地机什么品牌好?洗地机怎么选?618洗地机选购指南
随着科技的飞速发展,洗地机以其高效的清洁能力、稳定的性能和用户友好的设计而闻名,不仅可以高效吸尘、拖地,还不用手动洗滚布,已经逐渐成为现代家庭不可或缺的清洁助手。然而,在众多品牌和型号中,如何选择…...
nginx负载均衡配置
1.nginx负载均衡配置 upstream lbs {server 192.168.1.12:8080;server 192.168.1.12:8081; }server {listen 80;server_name localhost a.com;#charset koi8-r;#access_log logs/host.access.log main;location / {root html;index index.html index.htm;}locatio…...

HarmonyOS NEXT星河版之美团外卖点餐功能实战(中)
接上 一、UI布局 1.1 购物车Item Preview Component export struct MTCartItemView {build() {Row({ space: 6 }) {Image(https://bkimg.cdn.bcebos.com/pic/4d086e061d950a7bc94a331704d162d9f3d3c9e2).width(42).aspectRatio(1).borderRadius(5)Column({ space: 3 }) {Text…...

CTF-Web Exploitation(持续更新)
CTF-Web Exploitation 1. GET aHEAD Find the flag being held on this server to get ahead of the competition Hints Check out tools like Burpsuite to modify your requests and look at the responses 根据提示使用不同的请求方式得到response可能会得到结果 使用…...
图书管理系统c语言
创建一个图书管理系统是一个涉及数据结构和文件操作的项目。在C语言中,你可以使用结构体来表示图书信息,使用函数来实现系统的各项功能。以下是一个简单的图书管理系统的示例,包括基本的添加、显示、查找和删除图书的功能。 1. 定义图书结构…...

森林消防—高扬程水泵,高效、稳定、可靠!/恒峰智慧科技
森林,作为地球的“绿色肺叶”,不仅为我们提供了丰富的自然资源,更是维持生态平衡的重要一环。然而,随着全球气候的变化和人为活动的增加,森林火灾频发,给生态环境和人民生命财产安全带来了巨大威胁。在森林…...

UE5 学习系列(三)创建和移动物体
这篇博客是该系列的第三篇,是在之前两篇博客的基础上展开,主要介绍如何在操作界面中创建和拖动物体,这篇博客跟随的视频链接如下: B 站视频:s03-创建和移动物体 如果你不打算开之前的博客并且对UE5 比较熟的话按照以…...

关于iview组件中使用 table , 绑定序号分页后序号从1开始的解决方案
问题描述:iview使用table 中type: "index",分页之后 ,索引还是从1开始,试过绑定后台返回数据的id, 这种方法可行,就是后台返回数据的每个页面id都不完全是按照从1开始的升序,因此百度了下,找到了…...

376. Wiggle Subsequence
376. Wiggle Subsequence 代码 class Solution { public:int wiggleMaxLength(vector<int>& nums) {int n nums.size();int res 1;int prediff 0;int curdiff 0;for(int i 0;i < n-1;i){curdiff nums[i1] - nums[i];if( (prediff > 0 && curdif…...

CocosCreator 之 JavaScript/TypeScript和Java的相互交互
引擎版本: 3.8.1 语言: JavaScript/TypeScript、C、Java 环境:Window 参考:Java原生反射机制 您好,我是鹤九日! 回顾 在上篇文章中:CocosCreator Android项目接入UnityAds 广告SDK。 我们简单讲…...
Java 二维码
Java 二维码 **技术:**谷歌 ZXing 实现 首先添加依赖 <!-- 二维码依赖 --><dependency><groupId>com.google.zxing</groupId><artifactId>core</artifactId><version>3.5.1</version></dependency><de…...
Pinocchio 库详解及其在足式机器人上的应用
Pinocchio 库详解及其在足式机器人上的应用 Pinocchio (Pinocchio is not only a nose) 是一个开源的 C 库,专门用于快速计算机器人模型的正向运动学、逆向运动学、雅可比矩阵、动力学和动力学导数。它主要关注效率和准确性,并提供了一个通用的框架&…...

Kafka入门-生产者
生产者 生产者发送流程: 延迟时间为0ms时,也就意味着每当有数据就会直接发送 异步发送API 异步发送和同步发送的不同在于:异步发送不需要等待结果,同步发送必须等待结果才能进行下一步发送。 普通异步发送 首先导入所需的k…...

毫米波雷达基础理论(3D+4D)
3D、4D毫米波雷达基础知识及厂商选型 PreView : https://mp.weixin.qq.com/s/bQkju4r6med7I3TBGJI_bQ 1. FMCW毫米波雷达基础知识 主要参考博文: 一文入门汽车毫米波雷达基本原理 :https://mp.weixin.qq.com/s/_EN7A5lKcz2Eh8dLnjE19w 毫米波雷达基础…...
VUE3 ref 和 useTemplateRef
使用ref来绑定和获取 页面 <headerNav ref"headerNavRef"></headerNav><div click"showRef" ref"buttonRef">refbutton</div>使用ref方法const后面的命名需要跟页面的ref值一样 const buttonRef ref(buttonRef) cons…...
ubuntu系统 | docker+dify+ollama+deepseek搭建本地应用
1、docker 介绍与安装 docker安装:1、Ubuntu系统安装docker_ubuntu docker run-CSDN博客 docker介绍及镜像源配置:2、ubuntu系统docker介绍及镜像源和仓库配置-CSDN博客 docker常用命令:3、ubuntu系统docker常用命令-CSDN博客 docker compose安装:4、docker compose-CS…...