目录
PCIe总线的拓扑结构
PCI Express协议分层
物理层(Physical Layer)
数据链路层(Link Layer)
处理层(Transaction Layer)
软件层(Software Layer)
数据传输时候的流程
TLP和DLLP报文格式
PCIe总线的拓扑结构
PCIe采用的是树形拓扑结构, 一般由根组件(Root Complex),交换设备(Switch),终端设备(Endpoint)等类型的PCIe设备组成
Root Complex: 根桥设备,是PCIe最重要的一个组成部件; Root Complex主要负责PCIe报文的解析和生成。RC接受来自CPU的IO指令,生成对应的PCIe报文,或者接受来自设备的PCIe TLP报文,解析数据传输给CPU或者内存。
Switch: PCIe的转接器设备,目的是扩展PCIe总线。和PCI并行总线不同,PCIe的总线采用了高速差分总线,并采用端到端的连接方式, 因此在每一条PCIe链路中两端只能各连接一个设备, 如果需要挂载更多的PCIe设备,那就需要用到switch转接器。switch在linux下不可见,软件层面可以看到的是switch的上行口(upstream port, 靠近RC的那一侧) 和下行口(downstream port)。
一般而言,一个switch 只有一个upstream port, 可以有多个downstream port.
PCIe endponit: PCIe终端设备,是PCIe树形结构的叶子节点。比如网卡,NVME卡,显卡都是PCIe ep设备。
图1:PCIe 体系结构拓扑图
PCI Express协议分层
PCI Express体系结构采用分层设计,就像网络通信中的七层OSI结构一样,这样利于跨平台的应用。PCI-Express体系结构如图2所示。它共分为四层,从下到上分别为:
- 物理层(Physical Layer)
- 数据链路层(Link Layer)
- 处理层(Transaction Layer)
- 软件层(Software Layer)
图2 PCIe 协议层结构
-
物理层(Physical Layer)
物理层是最低层,它负责接口或者设备之间的链接,是物理接口之间的连接,可对应于网络中OSI七层模式中的物理层来理解。
物理层决定了PCI Express总线接口的物理特性,如点对点串行连接、微差分信号驱动、热拨插、可配置带宽等。初始的单一串行PCI Express链接包含两个低电压微分驱动信号对(4线的接收和发送对)的双向连接,即“发送”和“接受”信号。
数据时钟使用8/10b解码方式来达到相 当高的数据速率(这一技术同时也在其它串行总线技术中,如InfiniBand和RapidIO);时钟信息直接被编码成数据流,比起分离信号时钟更 好。
-
数据链路层(Link Layer)
数据链路层的主要职责就是确保数据包可靠、正确传输。它的任务是确保数据包的完整性,并在数据包中添加序列号和发送冗余校验码到处理层。大多数数据包 是由处理层发起的,基于信任,数据流控制协议确保数据包只在终端缓存空闲时传输。排队了所有数据的重试,使得信道带宽浪费现象得到有效地约束。
-
处理层(Transaction Layer)
处理层的作用主要是接受从软件层送来的读、写请求,并且建立一个请求包传输到链接层。所有请求都是分离执行,有些请示包将需要一个响应包。处理层同时 接受从链路层传来的响应包,并与原始的软件请求关联。处理层还整合或者拆分处理级数据包来发送请求,如数据读、写请求,并且操纵链接配置和信号控制。以确 保端到端连接通信正确,没有无效数据通过整个组织(包括源设备和目标设备,甚至包括可能通过的多个桥接器和交换器)。
在PCI Express总线技术中,数据包类型主要有两种,那就是由处理层发起的“处理层数据包”(Transaction Layer Packet,TLP)和“数据链路层数据包”(Data Link Layer Packet,DLLP)。每个数据包都有一个可以使响应包定向于正确发起者的唯一标识符,包的格式支持32位内存地址和扩展64位内存地址。包同时还有 如“非窥探”、“无严格排序”和“优先权”等属性,这些属性将应用于优化路由I/O子系统的数据包。
处理层包括4个地址空间,其中3个是PCI接口原有的,如内存、I/O和配置地址空间,另一外新PCI-Express接口新加的,它就是“信息空 间”。PCI2.2标准中介绍不断变化的系统中断宣传的方法称之为 “信息信号中断”(Message Signaled Interrupt,MSI)。这里特殊规格格式的内存写事物代替无边信号硬写,如中断、电源管理请求、复位等等有关信息方面。这几个地址空间类型的用途如下表所示:
地址空间 | 处理类型 | 基本用途 |
内存 | 读/写 | 处理来自或发送到内存中的数据 |
I/O | 读/写 | 处理来自或发送到I/O节点中的数据 |
配置 | 读/写 | 设备配置或者设置 |
信息 | 基线/供应商定义/先进交换 | 处理从事件信号机制到通用目信息的所有信息 |
表1:PCIe地址空间
-
软件层(Software Layer)
软件层被称为最重要的部分,因为它是保持与PCI总线兼容的关键。其目的在于使系统在使用PCI Express启动时,像在PCI下的初始化和运行那样,无论是在系统中发现的硬件设备,还是在系统中的资源,如内存、I/O空间和中断等,它可以创建非 常优化的系统环境,而不需要进行任何改动。在PCI-Express体系结构中保持这些配置空间和I/O设备连接的规范稳定是非常关键的。事实上,在 PCI-Express平台中所有操作系统在引导时都不需要进行任何编辑,也就是说在软件方面完全可以实现从PCI总线平稳过渡。
数据传输时候的流程
PCIE协议传输数据是以数据包的形式传输, 如下图所示从发送端说起。数据交到Device B 的Core层, 由Core层将数据格式转换成处理层(Transaction Layer)可以接受的报文格式,处理层产生相应的数据包,并存储再对应的Buffer中。数据继续传送到数据链路层(Data Link Layer),数据链路层将上一层传来的数据包添加Seq Num和CRC校验用来给接收端进行一些数据正确性的检查。然后在物理层(Physical Layer) 将数据进行编码,通过多条链路使用模拟信号进行传输。
在接收端,下图左侧示。物理层(Physical Layer)将接收到的数据包解码后传送到数据链路层(Data Link Layer),数据链层将接收的数据进行校验检查,没有问题就把数据传送给处理层(Transaction Layer)。处理层把数据压入buffer之后,Device A core 层将数据包转换成软件课程处理的数据。
一般来说在使用FPGA 开发时,如果调用PCIE 硬核,物理层/数据链路层/处理层,这三个层都已经集成在IP核里面了。
图3 PCIe 数据传输流程
TLP和DLLP报文格式
图4 TLP 包格式
TLP 包类型:
- Memory Read-Unlocked
- Memory Read-Locked
- Memory Write
- IO Read
- IO Write
- Configuration Read-Type 0
- Configuration Write-Type 0
- Completion -Unlocked
- Completion-Locked
- Completion w/data-Unlocked
- Completion w/data-Locked
- Message Request
- Message Request w/data
图5 DLLP 包格式
DLLP 包类型:
- TLP Ack/Nak
- Power Management
- Link Flow Control
- Vendor-Specific