PCIE协议理解

提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加

PCIE学习理解。


文章目录

  • PCIE协议理解
    • @[TOC](文章目录)
  • 前言
  • 零、PCIE掌握点?
  • 一、PCIE是什么?
  • 二、PCIE协议总结
    • 物理层
      • 切速
    • 链路层
    • 事务层
      • 6.2 TLP的路由
    • 电源管理
    • 虚拟化
  • 三、疑难杂症
    • PCIE4到PCIE5变化点
    • PCIE5到PCIE6变化点
    • Pcie bar 空间寄存器
    • ATS机制
  • 参考资料
  • 总结

前言

本文内容:PCIE协议理解和总结。

PCIE理解和总结。


提示:以下是本篇文章正文内容

零、PCIE掌握点?

PCIE是什么?
PCIE的优缺点是什么?
PCIE协议与其他协议的不同点是什么?
PCIE有什么应用场景?
PCIE控制器上游对接什么模块,下游对接什么模块?
PCIE驱动是什么?
PCIE芯片如何测试?

一、PCIE是什么?

PCIE是一种外围组件接口协议。

二、PCIE协议总结

物理层

切速

PCIE6下支持怎样的切速?
在这里插入图片描述

链路层

事务层

6.2 TLP的路由

基于地址的路由:
存储器读写和I/O读写使用此方式。

基于ID的路由:
主要用于配置读写请求TLP、Cpl、CplD报文和Vender_Defined消息报文。

隐式路由:
消息请求使用隐式路由方式。

电源管理

虚拟化

SR-IOV

SR-IOV介绍
SR-IOV 技术是一种基于硬件的虚拟化解决方案,可提高性能和可伸缩性。

SR-IOV 标准允许在虚拟机之间高效共享 PCIe(Peripheral Component Interconnect Express,快速外设组件互连)设备,并且它是在硬件中实现的,可以获得能够与本机性能媲美的 I/O 性能。SR-IOV 规范定义了新的标准,根据该标准,创建的新设备可允许将虚拟机直接连接到 I/O 设备。SR-IOV 规范由 PCI-SIG 在 http://www.pcisig.com 上进行定义和维护。单个 I/O 资源可由许多虚拟机共享。共享的设备将提供专用的资源,并且还使用共享的通用资源。这样,每个虚拟机都可访问唯一的资源。因此,启用了 SR-IOV 并且具有适当的硬件和 OS 支持的 PCIe 设备(例如以太网端口)可以显示为多个单独的物理设备,每个都具有自己的 PCIe 配置空间。

在这里插入图片描述
PF 包含 SR-IOV 功能结构,用于管理 SR-IOV 功能。PF 是全功能的 PCIe 功能,可以像其他任何 PCIe 设备一样进行发现、管理和处理。PF 拥有完全配置资源,可以用于配置或控制 PCIe 设备。虚拟功能 (Virtual Function, VF)是与物理功能关联的一种功能。VF 是一种轻量级 PCIe 功能,可以与物理功能以及与同一物理功能关联的其他 VF 共享一个或多个物理资源。==VF 仅允许拥有用于其自身行为的配置资源。==一个 具备SR-IOV能力的设备可以被配置成被枚举出多个Virtual Functions(数量可控制),而且每个Function 都有自己的完整有BAR的配置空间。VMM可以把一个或者多个VF 分配给VM。

三、疑难杂症

PCIE4到PCIE5变化点

除了 PCI Express Gen 5 版本附带的更严格的抖动要求、信道损耗预算约束以及通道电压和时间裕度要求外,速度提高还需要额外的物理层更改,同时还包括其他改进,以保持与以前的 PCIe 版本所需的向后兼容性。

有序集更改是 PCI Express 5.0 规范版本附带的一项重要修改。EIEOS 有序集用于帮助退出电气空闲状态。在 PCIe Gen 5 惯例中,用于每个 PCIe 4.0 有序对的熟悉的 16 个 0 和 1 的模式变成了对每个通道重复的 32 个 0 和 1。背靠背(重复)EIEOS 信号是 PCIe 5.0 协议的额外更改。数据流起始有序集 (SDS) 也已更新,因此接收方可以清楚地区分 PCI Express Gen 5 数据流起始点。

训练序列 (TS1/TS2) 受益于旨在促进 PCIe Gen 5 速度倍增的创新新选项。训练序列是链路建立和均衡 (EQ) 的必要先导,但随着有序集通过每个速度支持增量(从 2.5 GT/秒开始并逐步移动到 32.0 GT/秒 PCIe Gen 5 速度),训练序列也可能导致延迟。为了解决这个难题,提供了EQ 旁路选项,以基本上“跳过”中间速度均衡级别,或者通过使用“无 EQ”选项立即转换到 L0 活动数据传输状态来完全省略均衡。

PCIe Gen 5 的改进型 TS1 和 TS2 也增加了新的字段,用于替代协议标识和增强的预编码支持。一旦系统和设备之间的协商成功,链路就可以立即以支持的最高速度进入 L0 状态,并开始使用协商的备用协议传输数据。如果替代协议协商失败,系统可以快速恢复到主干 PCIe 5.0 协议。

PCIE5到PCIE6变化点

开发者需要考虑的PCIe 6.0的三个主要变化如下:

● 数据速率从32GT/s翻倍至64GT/s

● 从NRZ编码转换到PAM-4编码,以及由此带来的纠错影响

● 从传输的可变大小TLP到固定大小FLIT

● 除了速度,PCIe 6.0还引入了L0p链路状态,关于它的内容,我们将在介绍链路ASPM(L0,L1,L0s和L0p)中介绍。

Pcie bar 空间寄存器

如下图标红的两部分是bar寄存器。
在这里插入图片描述
为什么需要bar寄存器:

一方面这还是和CPU、操作系统的机制有关,它们不允许PCI设备自己在内存中划拉片地方供自己使用,而是必须由系统统一分配

另一方面PCI设备需要一定内存空间来存储自身需要的些数据,例如功能相关的配置数据,而且不同设备不同功能的情况下需要的空间大小还不一致,所以就有了bar寄存器了,用于对不同设备进行量身定制内存空间。

PCI设备有6个bar寄存器,可以启用全部或其中几个,一旦启用,这个bar寄存器就与内存建立了关系,主机就可以根据BARs中所写入的地址范围进行访问。任何时候,当设备发现一个请求事务的地址是映射到自己的一个BAR时,它就会接收这个请求事务,因为它自己就是这个请求的目标设备。

02bar寄存器如何使用:

根据上图可知,type0和type1拥有的bar数量是不一样的,为什么不一样放在后面说,bar在使用上可分为三种,分别是

1、32bit内存地址空间请求

2、64bit内存地址空间请求

3、IO地址空间请求

但在配置机制上是一致的,均是分为三个步骤,

Step 1
主机发起配置请求向目标PCIE设备的目标bar寄存器,对这个bar寄存器进行写 1操作。
Step 2
主机发起读配置请求读取目标PCIE设备的目标bar寄存器的值,由于有些bit 位主机是无法改写的,在上电就强制为固定值了,所以主机回读的值部分不是1。
Step 3
主机根据读取的值判断bar请求内存空间的大小并为其分配,并将起始地址写入目标bar寄存器,这就完成了两个功能,一是确定基地址,二是确定了寻址范围。具体是如何实现的呢?接下来以32bit内存地址空间请求为例详细看下bar寄存器的结构
在这里插入图片描述
这里提到了预取和非预取,对于PCI来说,预取功能能提升性能,但在PCIE上不是很明显,只不过将此继承了过来,所以可以先忽略,等后面用到了再说了。

03拿32bit的bar空间申请举例:
bar寄存器的存在的目的是告诉使用者我需要多大的空间,在诉说之前自身肯定得先知道并做一定设置,这种设置呢就是将某些位写0,且不可更改。

如下图是32bit非预取内存请求的申请过程描述,申请4KB大小的空间。
在这里插入图片描述
如上图(1)所描述的“Uninitialized bar”,bit0bit3是固定内容,bit11bit4的预设0就是表示申请内存大小的,12bit写0表示申请内存空间为4KB,因为2^12=4096嘛,如果bit13也是0,那就表示想要申请8KB的内存空间。

那么为啥要这样搞呢?主机又是怎么知道的呢?首先说主机是怎么知道的,主机会对bar寄存器各个bit位都写1(0XFFFFFFFF)然后再回读。对于我们这个例子回读内容就是0XFFFFF000,通过bit3~0知道了申请内存空间的属性,又因为bit12是1,所以知道了申请内存大小位4KB。

随后主机再把内存基地址写入bar寄存器,例如下图的0xF9000000,如此主机就知道了这个设备的对应功能的bar0申请4KB内存。

最后说,为什么要这样做,在我看来,这样做即实现了我们的目的,也节省了需要的配置字。我们需要告知主机需要多大的空间和属性,可以单独占一个字段,让主机读就行了。但再发TLP包时,主机寻址也需要知道目的地址,这样还需要一个字段。现在将两字段合一的,而且目的还实现了。

04另外两种bar寄存器的使用
如下图是对64bit的设置,申请一个64MB内存大小的过程,与32bit相比就是基地址更大些。
在这里插入图片描述

入下图是申请一个256Byte大小的过程,也就是bit8~2是固定为0,其中bit0为1表示是IO请求。

在这里插入图片描述

参考资料:bar空间介绍

ATS机制

ATS全称是Address Translation Service,顾名思义,就是一个地址翻译服务机制。PCIe下的ATS是以CPU为中心,PCIe总线上的各个设备可以通过ATS机制向主机申请未翻译地址对应的物理地址映射以及响应的属性、权限等信息。

在这里插入图片描述

一般地,在PCIe体系下,发起地址翻译请求的设备叫请求者,也叫client,而处理地址翻译请求的(即CPU)叫完成者,也叫home。因此,对于地址翻译请求的流程如下:
1、client有数据访问需求(或者是prefetching引入的需求);
2、client发出翻译请求给home侧,携带需要访问的虚拟地址空间块和响应属性、提示信息;
3、home侧进行翻译,之后返回翻译结果给client;
4、client在本地cache翻译结果;
5、client引擎发出数据访问,查本地cache,直接发出查完后的结果访问home侧;
6、home侧直接bypass TA,访问home本地内存。
在这里插入图片描述
ATS机制想要解决的问题(优势):
1、能够分担主机(CPU)侧的查表压力,特别是大带宽、大拓扑下的IO数据流,CPU侧的IOMMU/SMMU/VT-d的查表将会成为性能瓶颈,而ATS机制正好可以提供将这些查表压力卸载到不同的设备中,对整个系统实现“who consume it, who pay for it”。
2、对于IO设备往CPU的数据流,其IOMMU/SMMU/VT-d的查表性能在整个IO性能中显得极为关键,查表性能的好坏至今影响IO性能的好坏。而根据现今大量学术界和工业界的研究表明,决定查表性能的好坏的一个最为关键的点是TLB的预测。而像传统PCIe IO数据流,在CPU侧集中式做IOMMU/SMMU/VT-d的查表,对于其TLB的预测(prefetch)是很困难,极为不友好的。因为,很多不同workload的IO流汇聚到一点,对于TLB的预测的冲击很大,流之间的干扰很大,很难做出准确的预测,从而TLB的命中率始终做不到太高,从而影响IO性能。而ATS的机制恰好提供了一个TLB的预测卸载到源头去的机制,让用户(设备)自己根据自己自身的业务流来设计自己的预测策略,而且用户彼此之间的预测模型不会受到彼此的影响,从而大大提高了用户自己的预测的准确性。抽象来看,这时候的设备更像是CPU核,直接根据自身跑的workload来预测本地的TLB,从而提升预测性能,进而提升整系统的预测性能。

ATS机制就是一个分布式的地址翻译系统,对于异构架构的地址问题也起到了很好的支持效果。例如,NVIDIA和IBM最近搞的NVLINK互联CPU和GPU,其就是用了ATS来实现SVM,这个后续我想详细介绍一下。

当然,ATS也会带来如下两个比较严重的问题:

1、安全问题。也就是有了ATS后,设备会直接发出PA来访问CPU的内存空间,而CPU这边将不再查页表,从而也不再有地址访问权限的检查。因此,对于malicious设备,或者是被入侵的设备,又或者是设备自身设计的bug,其会发出PA访问那些其没有权限访问或者是不属于其的物理地址空间,从而带来系统的isolation的破坏,系统安全的威胁等安全问题。现有机制下,目前还没有解决办法。但,本人有专利可以解决,而且本人也有更好的机制可以解决,目前保密,暂时不能公布。本人的专利的话,后面有时间可以写一下。

2、无效化问题。也就是,在CPU侧被cache的页表发生变化(例如权限发生了变化,对应的PA需要回收SWAP等)的时候,此时CPU需要发出无效化指令给对应cache过的设备(ATC)来通知这件事,这会影响CPU回收页表/物理空间的性能。这就意味着CPU侧要实时跟踪页表被谁cache走了,维护这些信息也带来了成本的开销增长。

3、对设备的设计要求比较高,可以看到,ATS在某些时刻势必增加了延时。而为了减少甚至消除影响,就需要设备设计出具有良好的ATC机制,包括ATC的预测、地址翻译请求的长度、发送翻译请求的时机等,这里的设计空间都比较大,对设备的要求都比较高。

前面的问题1和2是系统需要解决的功能问题,后者3是一个趋势。我想象中的设备将会越来越智能,设备和CPU之间将会是点对点的平等计算地位,在异构体系下,它们是平等的计算关系。它们之间SVM、具有cache coherence等,从而第3看起来不是问题,而是趋势。

ATS机制

参考资料

PCIE6.0差异点基础介绍:
《PCIe 6.0概述》

NRZ编码和PAM4编码介绍:

《学会“NRZ”、“PAM4”,仅仅需要三分钟!》


总结

提示:这里pcie bar总结:

以上就是今天要讲的内容。

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

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Jupyter notebook快捷键

文章目录 Jupyter notebook键盘模式快捷键(常用的已加粗) Jupyter notebook键盘模式 命令模式:键盘输入运行程序命令;这时单元格框线为蓝色 编辑模式:允许你往单元格中键入代码或文本;这时单元格框线是绿色…

Unity图片导入设置

🏆 个人愚见,没事写写笔记 🏆《博客内容》:Unity3D开发内容 🏆🎉欢迎 👍点赞✍评论⭐收藏 🔎Unity支持的图片格式 ☀️BMP:是Windows操作系统的标准图像文件格式,特点是…

Spark-小练试刀

任务1:HDFS上有三份文件,分别为student.txt(学生信息表)result_bigdata.txt(大数据基础成绩表), result_math.txt(数学成绩表)。 加载student.txt为名称为student的RDD…

内存安全的攻防战:工具链与语言特性的协同突围

一、内存安全:C 开发者永恒的达摩克利斯之剑 在操作系统内核、游戏引擎、金融交易系统等对稳定性要求苛刻的领域,内存安全问题始终是 C 开发者的核心挑战。缓冲区溢出、悬空指针、双重释放等经典漏洞,每年在全球范围内造成数千亿美元的损失。…

OceanBase数据库-学习笔记1-概论

多租户概念 集群和分布式 随着互联网、物联网和大数据技术的发展,数据量呈指数级增长,单机数据库难以存储和处理如此庞大的数据。现代应用通常需要支持大量用户同时访问,单机数据库在高并发场景下容易成为性能瓶颈。单点故障是单机数据库的…

计算机网络——键入网址到网页显示,期间发生了什么?

浏览器做的第一步工作是解析 URL,分清协议是http还是https,主机名,路径名,然后生成http消息,之后委托操作系统将消息发送给 Web 服务器。在发送之前,还需要先去查询dns,首先是查询缓存浏览器缓存…

Qwen3本地化部署,准备工作:SGLang

文章目录 SGLang安装deepseek运行Qwen3-30B-A3B官网:https://github.com/sgl-project/sglang SGLang SGLang 是一个面向大语言模型和视觉语言模型的高效服务框架。它通过协同设计后端运行时和前端编程语言,使模型交互更快速且具备更高可控性。核心特性包括: 1. 快速后端运…

全面接入!Qwen3现已上线千帆

百度智能云千帆正式上线通义千问团队开源的最新一代Qwen3系列模型,包括旗舰级MoE模型Qwen3-235B-A22B、轻量级MoE模型Qwen3-30B-A3B。千帆大模型平台开源模型进一步扩充,以多维开放的模型服务、全栈模型开发、应用开发工具链、多模态数据治理及安全的能力…

蓝桥杯Python(B)省赛回忆

Q:为什么我要写这篇博客? A:在蓝桥杯软件类竞赛(Python B组)的备赛过程中我在网上搜索关于蓝桥杯的资料,感谢你们提供的参赛经历,对我的备赛起到了整体调整的帮助,让我知道如何以更…

数据转储(go)

​ 随着时间推移,数据库中的数据量不断累积,可能导致查询性能下降、存储压力增加等问题。数据转储作为一种有效的数据管理策略,能够将历史数据从生产数据库中转移到其他存储介质,从而减轻数据库负担,提高系统性能&…

Git Stash 详解

Git Stash 详解 在使用 Git 进行版本控制时,经常会遇到需要临时保存当前工作状态的情况。git stash 命令就是为此设计的,它允许你将未提交的更改暂存起来,在处理其他任务或分支后,再恢复这些更改。 目录 基本概念常用命令示例和…

Windows下Dify安装及使用

Dify安装及使用 Dify 是开源的 LLM 应用开发平台。提供从 Agent 构建到 AI workflow 编排、RAG 检索、模型管理等能力,轻松构建和运营生成式 AI 原生应用。比 LangChain 更易用。 前置条件 windows下安装了docker环境-Windows11安装Docker-CSDN博客 下载 Git下载…

Clang-Tidy协助C++编译期检查

文章目录 在Visual Studio中启用clang-tidyClang-tidy 常用的检查项readability-inconsistent-declaration-parameter-namemisc-static-assert 例子 C/C语言是一门编译型语言,比起python,javascript 这些,有很多BUG可以在编译期被排除掉,当然…

智能工厂规划学习——深入解读数字化工厂规划与建设方案

项目总体思路聚焦于通过智能制造和数字化工厂建设,来优化企业战略并提升信息化水平。首先,企业需学习先进国家已经验证的先进经验,并紧跟其正在变革的方向,以确保自身发展的前瞻性和竞争力。 在企业战略层面,企业正从以产品为中心的业务模式,逐步转变为以服务中心…

Go RPC 服务方法签名的要求

在 Go 中,RPC 方法的签名有严格的要求,主要是为了保证方法的调用能够通过网络正确地传输和解析。具体要求如下: 1. 方法必须是导出的 RPC 服务的方法必须是导出的(即首字母大写)。这是因为 Go 的反射机制要求服务方法…

上位机 日志根据类型显示成不同颜色

前言 在上位机软件开发中日志是一个很重要的信息。一方面显示系统的运行情况,另一方面主要用于排查软件BUG和设备问题的重要参考。为了方面识别日志类型最好的方式是使用不同的颜色进行区分。这样就一目了然了。 效果 实现代码 1.根据 ListBox 控件 进行扩展了一个自定义控件…

CMake解析参数用法示例

cmake_parse_arguments 是 CMake 中用于解析函数或宏参数的工具,特别适合处理带有选项(OPTIONS)、单值参数(SINGLE_ARGS)和多值参数(MULTI_ARGS)的复杂参数列表。以下是用法说明和一个示例&…

自定义JackSon配置

避免前端&#xff08;JavaScript&#xff09;处理大数&#xff08;如 Long、BigInteger&#xff09;时发生精度丢失问题&#xff0c;所以引入了自定义 Jackson 配置。 先看代码&#xff1a; /** 根据id修改员工信息*/PutMappingpublic R<String> update(HttpServletRequ…

Qt入门——什么是Qt?

Qt背景介绍 什么是Qt? Qt 是⼀个 跨平台的 C 图形用户界面应用程序框架 。它为应用程序开发者提供了建立艺术级图形界面所需的所有功能。它是 完全面向对象 的&#xff0c;很容易扩展。Qt 为开发者提供了 ⼀种基于组件的开发模式 &#xff0c;开发者可以通过简单的拖拽和组合…

Linux CentOS 安装Python 3.8.0

在 CentOS 上升级 Python 3.6.8 到 3.8.0&#xff0c;可以按照以下步骤操作&#xff1a; 1. 安装依赖 sudo yum groupinstall -y "Development Tools" sudo yum install -y openssl-devel bzip2-devel libffi-devel zlib-devel wget 如果遇到报错“File "/bin…