前身 PCI
PCI总线是一种由英特尔于1991年推出的局部总线标准,最早提出的PCI总线工作在33MHz频率之下,传输带宽达到133MB/s(33MHz * 32bit/s),后面提出64bit的pci总线,总线频率也提升到66MHz。PCI总线使用并行总线结构,在同一条总线上所有的外部设备共享总线带宽:采用共享总线的机制,会出现不同的设备抢占总线的情况,所有带宽还是有限。PCI后来被PCIe取代,但在编程中两者兼容。
PIC基本拓扑结构
- PCI 设备:符合 PCI 总线标准的设备就被称为 PCI 设备,PCI 总线架构中可以包含多个 PCI 设备。PCI 设备同时也分为主设备和目标设备两种,主设备是一次访问操作的发起者,而目标设备则是被访问者。
- PCI 总线:PCI 总线在系统中可以有多条,类似于树状结构进行扩展,每条 PCI 总线都可以连接多个 PCI 设备/桥。
- PCI 桥:当一条 PCI 总线的承载量不够时,可以用新的 PCI 总线进行扩展,而 PCI 桥则是连接 PCI 总线之间的纽带。
北桥一般用来连接processor处理器,图像接口,存储接口和PCI总线。南桥用来连接PCI总线和外围设备,同时南桥也通常给PCI总线提供系统复位信号,时钟信号和错误报告信号。这个是PIC桥一般的设计,图中分在上下所以叫南北桥。
二、PCIE简介
PCIe,英文缩写为PCIe或者PCI Express,一般用于CPU与外部设备进行高速连接(GPU,声卡)。PCIe是点对点,全双工的差分传输信号总线,基于数据包协议传输。点对点互连表示链路上的电气负载有限,从而使发送和接收频率可扩展到更高。PCIe目前成熟的版本有GEN1,GEN2,GEN3,GEN4和GEN5,每一代相较上一代传输速率和传输带宽都有了很大幅度的提升。
- 点对点传输 :每一个设备是对于一条完整的总线
- 差分传输: 每个信号由一对差分信号压差来表示:D+和D-之间电压差为正表示1,D+和D-之间的电压差为负表示0。
- 通信协议帧传输:分为三层协议–事务层、数据链路层、物理层
- 链路(Links):PCIe设备之间的信号传输路径称作链路(Links),一个Links由一个或多个收发通道(Lanes)组成
- 收发通道(Lanes):一个通道内由一对差分信号组成,lanes的连接可以不用端口对应方便布局布线,会在软件端做处理
比如:lane1可以对接其他设备laneX,D+可以接D+;
GT/S:Giga transaition per second,即每一秒内传输的次数
带宽(吞吐量)=(传输速率×lane数量×编码效率)/8 (结果单位是GB/S)
举个例子,PCIE1.0x4,带宽=(2.5GT/s ×4×0.8)/8=1GB/s
三、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设备。
四、PCIE传输协议
PCIe 定义了一种分层的体系结构,这些层在逻辑上是相互独立的,且各层仅负责相同层内的通信(例如,发送端和接收端的事务层都只处理数据包的事务层信息),各层都有一个用于发出信息流的发送端和一个接收信息流的接收端。
- 设备核心层以及它与事务层的接口(PCIe Core Hardware/Software Interface):设备核心层实现设备的主要功能—如果设备是一个endpoint,那么它最多可以包含 8 个功能(function),每个功能实现自己的配置空间;如果设备是一个swtich,那么其核心由数据包路由逻辑和内部总线构成;如果设备是一个 RC,那么其核心会实现一个虚拟的 PCI 总线 0,在这个虚拟的 PCI 总线 0中存在着所有的芯片组嵌入式端点以及虚拟桥。
- 事务层(Transcation Layer):事务层负责TLP(Transaction Layer Packet,事务层包)的产生(发送端)和解析(接收端),同时也负责 QoS(Quality of Service,服务质量)、流量控制以及事务排序。
- 数据链路层(Data Link Layer):数据链路层负责DLLP(Data Link Layer Packet,数据链路层包)的产生和解析,同时负责链路错误检测以及修正(也称为Ack/Nak 协议)。
- 物理层(Physical Layer):物理层负责字符序列包的产生和解析。具体而言,物理层实现TLP、DLLP和字符序列包在物理链路上的发送与接收。在发送端,数据包将经过字节条带化逻辑、扰码器、编码器(8b/10b编码或128b/130b编码)和并-串转换模块的处理;在传输链路上,数据包将以训练后的链路速率以差分形式传输;在接收端,物理层须从数据流中恢复出时钟(Clock and Data Recovery,CDR,时钟数据恢复),数据包将经过串-并转换模块、缓存、解码器、解扰器和字节交换恢复逻辑(对应在发送端的逆操作)。此外,物理层中包含LTSSM(Link Training and Status State Machine,链路训练状态机),负责进行链路初始化以及训练。