PCI Express 体系结构导读摘录(三)

news2024/9/26 5:15:15

在这里插入图片描述

系列文章目录


PCI Express 体系结构导读摘录(一)
PCI Express 体系结构导读摘录(二)
PCI Express 体系结构导读摘录(三)


文章目录

  • 系列文章目录
  • 第 6 章  PCIe 总线的事务层
  • 6. 1  TLP 的格式
      • 6. 1. 1 通用 TLP 头的 Fmt 字段和 Type 字段
      • 6. 1. 2  TC 字段
      • 6. 1. 3  Attr 字段
      • 6. 1. 4  通用 TLP 头中的其他字段
    • 6. 2  TLP 的路由
      • 6. 2. 1  基于地址的路由
      • 6. 2. 2  基于 ID 的路由


第 6 章  PCIe 总线的事务层

    事务层是 PCIe 总线层次结构的最高层, 该层次将接收 PCIe 设备核心层的数据请求, 并 将其转换为 PCIe 总线事务, PCIe 总线使用的这些总线事务在 TLP(Transaction Layer Packet) 头中定义。 PCIe 总线继承 了 PCI / PCI-X 总线的大多数总线事务, 如存储器读写、 I / O 读写、 配置读写总线事务, 并增 加了 Message 总线事务和原子操作等总线事务。

    本节重点介绍与数据传送密切相关的总线事务, 如存储器、 I / O、 配置读写总线事务。 在 PCIe 总线中, Non-Posted 总线事务分两部分进行, 首先是发送端向接收端提交总线读写 请求, 之后接收端再向发送端发送完成 ( Completion) 报文。 PCIe 总线使用 Split 传送方式处理所有 Non-Posted 总线事务, 存储器读、 I / O 读写和配置读写这些 Non-Posted 总线事务都 使用 Split 传送方式。 PCIe 的事务层还支持流量控制和虚通路管理等一系列特性, 而 PCI 总 线并不支持这些新的特性。

    在 PCIe 总线中, 不同的总线事务采用的路由方式不相同。 PCIe 总线继承了 PCI 总线的地址路由和 ID 路由方式, 并添加了 “隐式路由” 方式。

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

    数据链路层还可以产生 DLLPData Link Layer Packet) 。 DLLPTLP 没有直接关系。 DLLP 是产生于数据链路层, 终止于数据链路层, 并不会传递到事务层。 DLLP 不是 TLP 加 上前缀和后缀形成的。 数据链路层的报文 DLLP 通过物理层时, 需要经过 8 / 10b 编码, 然后 再进行发送。 而数据的接收过程是发送过程的逆过程。

6. 1  TLP 的格式

    当处理器或者其他 PCIe 设备访问 PCIe 设备时, 所传送的数据报文首先通过事务层被封 装为一个或者多个 TLP, 之后才能通过 PCIe 总线的各个层次发送出去。 TLP 的基本格式如 图 6-1 所示。

在这里插入图片描述

    一个完整的 TLP 由 1 个或者多个 TLP PrefixTLP 头、 Data Payload (数据有效负载) 和 TLP Digest 组成。 TLP 头是 TLP 最重要的标志, 不同的 TLP 其头的定义并不相同。 TLP 头包含了当前 TLP 的总线事务类型、 路由信息等一系列信息。 在一个 TLP 中, Data Payload 的长度可变, 最小为 0, 最大为 1024DW

    TLP Digest 是一个可选项, 一个 TLP 是否需要 TLP Digest 由 TLP 头决定。 Data Payload 也 是一个可选项, 有些 TLP 并不需要 Data Payload, 如存储器读请求、 配置和 I / O 写完成 TLP 并不需要 Data Payload。

    TLP Prefix 由 PCIe V2. 1 总线规范引入, 分为 Local TLP Prefix 和 EP-EP TLP Prefix 两类。 其中 Local TLP Prefix 的主要作用是在 PCIe 链路的两端传递消息, 而 EP-EP TLP Prefix 的主 要作用是在发送设备和接收设备之间传递消息。 设置 TLP Prefix 的主要目的是为了扩展 TLP 头, 并以此支持 PCIe V2. 1 规范的一些新的功能。

    TLP 头由 3 个或者 4 个双字 (DW) 组成。 其中第一个双字中保存通用 TLP 头, 其他字段与通用 TLP 头的 Type 字段相关。 一个通用 TLP 头由 Fmt、 Type、 TC、 Length 等字段组成, 如图 6-2 所示。

在这里插入图片描述

    如果存储器读写 TLP 支持 64 位地址模式时, TLP 头的长度为 4DW, 否则为 3DW。 而完 成报文的 TLP 头不含有地址信息, 使用的 TLP 头长度为 3DW。 其中 Byte 4 ~ Byte 15 的格式 与 TLP 相关, 下文将结合具体的 TLP 介绍这些字段。

6. 1. 1 通用 TLP 头的 Fmt 字段和 Type 字段

    FmtType 字段确认当前 TLP 使用的总线事务, TLP 头的大小是由 3 个双字还是 4 个双字组成, 当前 TLP 是否包含有效负载。 其具体含义如表 6-1 所示。

在这里插入图片描述

    其中所有读请求 TLP 都不带数据, 而写请求 TLP 带数据, 而其他 TLP 可能带数据也可能不带数据, 如完成报文可能含有数据, 也可能仅含有完成标志而并不携带数据。 在 TLPType 字段中存放 TLP 的类型, 即 PCIe 总线支持的总线事务。 该字段共由 5 位组成, 其含义如表 6-2 所示。

在这里插入图片描述

    存储器读和写请求, IO 读和写请求, 及配置读和写请求的 type 字段相同, 如存储器读和写请求的 Type 字段都为 0b0 0000。 此时 PCIe 总线规范使用 Fmt 字段区分读写请求, 当 Fmt 字段是 “带数据” 的报文, 一定是 “写报文” ; 当 Fmt 字段是 “不带数据” 的报文, 一 定是 “读报文” 。

    PCIe 总线的数据报文传送方式与 PCI 总线数据传送有类似之处。 其中存储器写 TLP 使用 Posted 方式进行传送, 而其他总线事务使用 Non-Posted 方式。

    PCIe 总线规定所有 Non-Posted 存储器请求使用 Split 总线方式进行数据传递。 当 PCIe 设备进行存储器读、 I / O 读写或者配置读写请求时, 首先向目标设备发送数据读写请求 TLP, 当目标设备收到这些读写请求 TLP 后, 将数据和完成信息通过完成报文 ( Cpl 或者 CplD) 发送给源设备。

    其中存储器读、 I / O 读和配置读需要使用 CplD 报文, 因为目标设备需要将数据传递给 源设备; 而 I / O 写和配置写需要使用 Cpl 报文, 因为目标设备不需要将任何数据传递给源设 备, 但是需要通知源设备, 写操作已经完成, 数据已经成功地传递给目标设备。

    在 PCIe 总线中, 进行存储器或者 I / O 写操作时, 数据与数据包头一起传递; 而进行存 储器或者 I / O 读操作时, 源设备首先向目标设备发送读请求 TLP, 而目标设备在准备好数据 后, 向源设备发出完成报文。

    与 PCI 总线不同, PCIe 总线规范定义了 Msg 报文, 即消息报文, 分别为 MsgMsgD。 这两种报文的区别在于一个报文可以传递数据, 一个不能传递数据。

    PCIe V2. 1 总线规范还补充了一些总线事务, 如 FetchAddSwapCASLPrfxEPrfx。 其中 LPrfx 和 EPrfx 总线事务分别与 Local TLP Prefix 和 EP-EP TLP Prefix 对应。 在 PCIe 总线 规范 V2. 0 中, TLP 头的大小为 1DW, 而使用 LPrfx 和 EPrfx 总线事务可以对 TLP 头进行扩 展, 本节不对这些 TLP Prefix 做进一步介绍。 PCIe 设备可以使用 FetchAdd、 Swap 和 CAS 总 线事务进行原子操作, 第 6. 3. 5 节将详细介绍该类总线事务。

6. 1. 2  TC 字段

    TC 字段表示当前 TLP 的传送类型, PCIe 总线规定了 8 种传输类型, 分别为 TC0 ~ TC7, 缺省值为 TC0, 该字段与 PCIe 的 QoSQuality of Service,服务质量) 相关。 PCIe 设备使用 TC 区分不同类型的数据传递, 而多数 EP 中只含有一个 VC, 因此这些 EP 在发送 TLP 时, 也仅仅使用 TC0, 但是有些对实 时性要求较高的 EP 中, 含有可以设置 TC 字段的寄存器。

6. 1. 3  Attr 字段

    Attr 字段由 3 位组成, 其中第 2 位表示该 TLP 是否支持 PCIe 总线的 ID-based Ordering; 图 6-3 Attr 字段格式第 1 位表示是否支持 Relaxed Ordering; 而第 0 位表示该 TLP 在经过 RC 到达存储器时, 是否需要进行 Cache 共享一致性处理。 Attr 字段如图 6-3 所示。

在这里插入图片描述

    一个 TLP 可以同时支持 ID-based OrderingRelaxed Orde- ring 两种位序。 Relaxed Ordering 最早在 PCI-X 总线规范中提出, 用来提高 PCI-X 总线的数据传送效率; 而 ID-based Orde- ring 由 PCIe V2. 1 总线规范提出。 TLP 支持的序如表 6-3 所示。

在这里插入图片描述

    当使用标准的强序模型时, 在数据的整个传送路径中, PCIe 设备在处理相同类型的 TLP 时, 如 PCIe 设备发送两个存储器写 TLP 时, 后面的存储器写 TLP 必须等待前一个存 储器写 TLP 完成后才能被处理, 即便当前报文在传送过程中被阻塞, 后一个报文也必须 等待。

    如果使用 Relaxed Ordering 模型, 后一个存储器写 TLP 可以穿越前一个存储器写 TLP, 提前执行, 从而提高了 PCIe 总线的利用率。 有时一个 PCIe 设备发出的 TLP, 其目的地址并 不相同, 可能先进入发送队列的 TLP, 在某种情况下无法发送, 但这并不影响后续 TLP 的发 送, 因为这两个 TLP 的目的地址并不相同, 发送条件也并不相同。

    Attr 字段的第 0 位是 “No Snoop Attribute” 位。 当该位为 0 时表示当前 TLP 所传送的数 据在通过 FSB 时, 需要与 Cache 保持一致, 这种一致性由 FSB 通过总线监听自动完成而不 需要软件干预; 如果为 1, 表示 FSB 并不会将 TLP 中的数据与 Cache 进行一致, 在这种情况 下, 进行数据传送时, 必须使用软件保证 Cache 的一致性。

6. 1. 4  通用 TLP 头中的其他字段

    除了 Fmt 和 Type 字段外, 通用 TLP 头还含有以下字段。

  1. TH 位、 TD 位和 EP
        TH 位为 1 表示当前 TLP 中含有 TPHTLP Processing Hint) 信息, TPH 是 PCIe V2. 1 总 线规范引入的一个重要功能。 TLP 的发送端可以使用 TPH 信息, 通知接收端即将访问数据 的特性, 以便接收端合理地预读和管理数据, TPH 的详细介绍见第 6. 3. 6 节。
       
        TD 位表示 TLP 中的 TLP Digest 是否有效, 为 1 表示有效, 为 0 表示无效。 而 EP 位表示 当前 TLP 中的数据是否有效, 为 1 表示无效, 为 0 表示有效。

  2. AT 字段
        AT 字段与 PCIe 总线的地址转换相关。 在一些 PCIe 设备中设置了 ATCAddress Translation Cache) 部件, 这个部件的主要功能是进行地址转换。 只有在支持 IOMMU 技术的处理器 系统中, PCIe 设备才能使用该字段。

  3. Length 字段
        Length 字段用来描述 TLP 的有效负载 (Data Payload) 大小 。 PCIe 总线规范规定一个 TLP 的 Data Payload 的大小在 0 ~ 4096 B 之间。 PCIe 总线设置 Length 字段的目的是提高总线的传送效率。

6. 2  TLP 的路由

    TLP 的路由是指 TLP 通过 Switch 或者 PCIe 桥片时采用哪条路径, 最终到达 EP 或者 RC 的方法。 PCIe 总线一共定义了三种路由方法, 分别是基于地址 (Address) 的路由, 基于 ID 的路由和隐式路由 ( Implicit) 方式。

    存储器和 I / O 读写请求 TLP 使用基于地址的路由方式, 这种方式使用 TLP 中的 Address 字段进行路由选径, 最终到达目的地。

    而配置读写报文、 “Vendor_Defined Messages” 报文、 CplCplD 报文使用基于 ID 的路 由方式, 这种方式使用 PCI 总线号 ( Bus Number) 进行路由选径。 在 Switch 或者多端口 RC 的虚拟 PCI-to-PCI 桥配置空间中, 包含如何使用 PCI 总线号进行路由选径的信息。

    而隐式路由方式主要用于 Message 报文的传递。 在 PCIe 总线中定义了一系列消息报文, 包括 “ INTx Interrupt Signaling” , “ Power Management Messages” 和 “ Error Signal Messages” 等报文。 在这些报文中, 除了 “Vendor_Defined Messages” 报文, 其他所有消息报文都使用隐式路由方式, 隐式路由方式是指从下游端口到上游端口进行数据传递的使用路由方式, 或者用于 RCEP 发出广播报文。

6. 2. 1  基于地址的路由

    在 PCIe 总线中, 存储器读写和 I / O 读写 TLP 使用基于地址的路由方式。 PCIe 设备使用的地址路由方式与 PCI 设备使用的地址路由方式类似。 只是 PCIe 设备使用 TLP 进行数据传 送, 而 PCI 设备使用总线周期进行数据传送。 使用地址路由方式进行数据传递的 TLP 格式如第 6. 3. 1 节的图 6-8 所示, 在这类 TLP 中包含目的设备的地址。

    当一个 TLP 进行数据传递时, 可能会经过多级 Switch, 最终到达目的地。 Switch 将根据存储器读写和 I / O 读写请求 TLP 的目的地址将报文传递到合适的 Egress 端口上。 如图 4-10 所示, 在一个 Switch 中包含了多个虚拟 PCI-to-PCI 桥。 在 Switch 中有几个端口, 就包含几个 虚拟 PCI-to-PCI 桥。

在这里插入图片描述

    图 6-4 中的配置寄存器描述了该虚拟 PCI-to-PCI 桥下游 PCI 子树使用的三组空间范围, 分别为 I / O、 存储器和可预取的存储器空间, 分别用 BaseLimit 两类寄存器描述, 其中 Base 寄存器表示可访问空间的基地址, Limit 寄存器表示可访问空间的大小。 TLP 使用基于 地址的路由时, 一定要通过查询这组寄存器之后, 再决定传送路径。 这组寄存器的使用方法与 PCI 总线中的 PCI 桥兼容。

在这里插入图片描述

6. 2. 2  基于 ID 的路由

    在 PCIe 总线中, 基于 ID 的路由方式主要用于配置读写请求 TLP、 Cpl 和 CplD 报文, 此 外 Vendor_Defined 消息报文也可以使用这种基于 ID 的路由方式。 而在 PCI 总线中, 只有配置读写周期才使用 ID 进行数据传递。

    基于 ID 的路由方式与基于地址的路由方式有较大的不同, 基于 ID 路由方式的 TLP 头格式也与基于地址路由方式的头格式不同, 其报文格式如图 6-6 所示。

在这里插入图片描述

    使用 ID 路由方式的 TLP 头, 其 Byte8 ~ Byte11 字段与基于地址路由的 TLP 不同。 基于 ID 路由的 TLP, 使用 Bus NumberDevice NumberFunction Number 进行路由寻址。 从软件 的角度来看, PCIe 总线与 PCI 总线兼容, 只是在 PCIe 总线中, 每一个 PCIe 设备使用唯一的 PCI 设备号, 但是每一个设备仍然可以有多个子设备 (Function) 。

    PCIe 总线规定, 在一个 PCI 总线域空间中, 最多只能有 256 条 PCI 总线, 因此在一个 TLP 中, Bus Number 由 8 位组成; 而在每一条总线中最多包含 32 个设备, 因此 TLP 中的 Device Number 由 5 位组成; 而每一个设备中最多包含 8 个功能, 因此一个 TLP 的 Function Number 由 3 位组成。

    配置读写请求 TLP 是使用 “基于 ID 路由” 的一组重要报文, 其主要作用是读写 PCIe 总线的 EPSwitchPCIe 桥片的配置寄存器, 以完成 PCIe 总线的配置。 在处理器系统上电之后需要进行 PCI 总线系统的枚举, 为 PCI 总线分配总线号, 并设置 SwitchPCIe 桥片或者 EP 的配置寄存器, 如 Limit 寄存器组、 Base 寄存器组、 BAR 寄存器、 Subordinate Bus NumberSecondary Bus NumberPrimary Bus Number 等一系列配置寄存器。

    在上文中我们简单介绍了 Limit 寄存器组和 Base 寄存器组的用法, 下文将重点描述 Subordinate Bus Number(下级总线号)、 Secondary Bus NumberPrimary Bus Number 寄存器。 Subordinate Bus Number、 Secondary Bus Number 和 Primary Bus Number 寄存器在 Type 01h 配置寄存器中, 用 来描述 PCI-to-PCI 桥片的上游及下游总线号。 这段寄存器在 PCI 配置寄存器中的位置如所图 6-7 示。

   

   

   

   

   

   

   

   

   

   

   

   

   

   

   

   

   

   

   

   

   

   
 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2109935.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【运维自动化-作业平台】如何快速执行脚本和分发文件

脚本执行和文件分发是作业平台最基本、最核心的两个原子功能,主要分页面快速执行和作业里步骤引用,使用逻辑一样,一起来看看具体如何使用快速执行脚本 核心实现原理就是基于gse的命令管道,把脚本内容以WebPortal的方式透传到目标…

基于yolov8的口罩佩戴检测系统python源码+onnx模型+评估指标曲线+精美GUI界面

【算法介绍】 基于YOLOv8的口罩佩戴检测系统是一款利用深度学习技术,特别是YOLOv8算法,实现高效、准确检测人脸是否佩戴口罩的系统。YOLOv8作为YOLO系列算法的最新版本,在检测速度和准确性上进行了显著优化,能够实时处理图像和视…

UDP协议程序设计

文章目录 前言一、UDP程序设计是什么?二、使用步骤 1.数据包套接字与多播套接字2.数据报包3.实操展示总结 前言 UDP协议程序相对于TCP协议,就是一个广播喇叭给全村人听和两个人说悄悄话的差别。因此UDP的数据传输效率比TCP高,可以同时分享给所…

《Windows PE》3.1 基本概念

在正式讲解PE文件格式之前,我们有必要先熟悉和PE相关的一些基本概念,以便于更好的理解和掌握PE文件格式。 本节必须掌握的知识点: 地址 指针 数据目录项 节 对齐方式 字符串编码格式 3.1.1 地址 ■在PE文件中涉及到四类地址 ●VA虚拟内存地…

【Linux】Shell 与权限:Linux 系统的双重保障

欢迎来到 CILMY23 的博客 🏆本篇主题为:Shell 与权限:Linux 系统的双重保障 🏆个人主页:CILMY23-CSDN博客 🏆系列专栏:Python | C | C语言 | 数据结构与算法 | 贪心算法 | Linux | 算法专题 …

三、搭建网站服务器超详细步骤——FinalShell下载安装使用流程(免费国产的SSH工具)+宝塔安装方法(分享两种安装宝塔的方法)

前言 本篇博客是搭建网站服务器模块下的第3部分 FinalShell下载安装使用流程 在分享这篇博客之前,首先讲一下,FinalShell软件是干什么用的,用大白话进行说明一下:这个软件是一款远程控制和管理服务器的软件,通过S…

C++字符串与整数的相互转换

文章目录 前言字符串转整数stoiisstringstreamatoi 字符转整数to_stringstringstreamsprintf ASCII码转换 前言 题目大致为: 给一组数据,去掉里面的2,然后再返回结果 例如: 输入:{20, 66, 521, 2024} 输出&#xff1…

手机如何切换网络IP地址:‌方法详解与操作指南‌

在当今的数字化时代,‌网络IP地址作为设备在网络中的唯一标识,‌扮演着至关重要的角色。‌对于手机用户而言,‌了解如何切换网络IP地址不仅有助于提升网络体验,‌还能在一定程度上保护个人隐私。‌本文将详细介绍手机切换网络IP地…

仿论坛项目--Kafka,构建TB级异步消息系统

阻塞队列 • BlockingQueue 解决线程通信的问题。阻塞方法:put、take。 • 生产者消费者模式生产者:产生数据的线程。消费者:使用数据的线程。 • 实现类ArrayBlockingQueueLinkedBlockingQueuePriorityBlockingQueue、SynchronousQueue、D…

火语言RPA流程组件介绍--浏览器设置

🚩【组件功能】:浏览器设置,实例化对象,并执行是否显示图片/是否显示浏览器窗体等操作 配置预览 配置说明 操作浏览器类型 内置浏览器 外部浏览器 浏览器位置 本机安装的chrome浏览器可执行文件的路径(选择外部浏览器时必填)…

9月出海风向标:越南国庆节、巴西独立日、游戏外部开发大会、东京电玩节来袭!

9月如期而至,各位出海人准备好迎接新一轮增长机会了吗?以下是9月全球热门节日、行业大会活动信息: 01. 越南国庆节 越南国庆日,也称为“Quốc khnh nước CHXHCN Việt Nam”,是每年的9月2日,这一天标志着…

MySQL Workbench 的入门指南

前言 MySQL Workbench 是一个官方的图形化工具,用于开发、管理和设计 MySQL 数据库服务器。它提供了丰富的功能,可以帮助数据库管理员、开发者以及DBA们高效地工作。下面是一个MySQL Workbench的入门指南,介绍如何安装和使用它。 安装 MyS…

FP7209:非同步升压恒流LED区动IC

前言:LED驱动芯片是什么? LED驱动器(LED Driver),是指驱动LED发光或LED模块组件正常工作的电源调整电子器件。由于LED PN结的导通特性决定,它能适应的电源电压和电流变动范围十分狭窄,稍许偏离…

恋爱相亲交友系统源码原生源码可二次开发APP 小程序 H5,web全适配

直播互动:平台设有专门的直播间,允许房间主人与其他异性用户通过视频连线的方式进行一对一互动。语音视频交流:异性用户可以发起语音或视频通话,以增进了解和交流。群组聊天:用户能够创建群聊,邀请自己关注…

用亚马逊云科技Graviton高性能/低耗能处理器构建AI向量数据库(下篇)

简介: 今天小李哥将介绍亚马逊推出的云平台4代高性能计算处理器Gravition,并利用该处理器构建生成式AI向量数据库。利用向量数据库,我们可以开发和构建多样化的生成式AI应用,如RAG知识库,特定领域知识的聊天机器人等。…

Unity中使用四元数限制旋转

前言 在处理旋转相关的内容的时候,如果使用unity提供的欧拉角描述旋转,会出现一下两种问题 同一旋转的表示不唯一万向节死锁 绕轴90旋转与绕轴90+360旋转的表现是一致的 当某个特定轴达到某个特殊值时,绕一个轴旋转可能会覆盖另一…

Python 学习笔记(一)

input 函数 input():将输入数据的类型都转化为字符串 range 函数 自定义函数 函数与方法 列表 字符串 切片 集合 字典 函数的参数 匿名函数 文件操作 异常处理

JavaScript 21个常用数组使用方法

前言 在 JavaScript 中,数组是一种特殊类型的对象,用于存储和组织多个值。数组使您可以将值分组到单个变量名下,从而方便管理和操作数据集合。以下是更详细的解释: 在 JavaScript 中,一对方括号 [] 表示数组。数组中…

Kafka【第一篇】Kafka集群搭建

Kafka初识 1、Kafka使用背景 在我们大量使用分布式数据库、分布式计算集群的时候,是否会遇到这样的一些问题: 我们想分析下用户行为(pageviews),以便我们设计出更好的广告位我想对用户的搜索关键词进行统计&#xff…