PCIE(Peripheral Component Interconnect Express)基础概述

前身 PCI

  PCI总线是一种由英特尔于1991年推出的局部总线标准,最早提出的PCI总线工作在33MHz频率之下,传输带宽达到133MB/s(33MHz * 32bit/s),后面提出64bit的pci总线,总线频率也提升到66MHz。PCI总线使用并行总线结构,在同一条总线上所有的外部设备共享总线带宽:采用共享总线的机制,会出现不同的设备抢占总线的情况,所有带宽还是有限。PCI后来被PCIe取代,但在编程中两者兼容。

PIC基本拓扑结构

  1. PCI 设备:符合 PCI 总线标准的设备就被称为 PCI 设备,PCI 总线架构中可以包含多个 PCI 设备。PCI 设备同时也分为主设备和目标设备两种,主设备是一次访问操作的发起者,而目标设备则是被访问者。
  2. PCI 总线:PCI 总线在系统中可以有多条,类似于树状结构进行扩展,每条 PCI 总线都可以连接多个 PCI 设备/桥。
  3. PCI 桥:当一条 PCI 总线的承载量不够时,可以用新的 PCI 总线进行扩展,而 PCI 桥则是连接 PCI 总线之间的纽带。

  北桥一般用来连接processor处理器,图像接口,存储接口和PCI总线。南桥用来连接PCI总线和外围设备,同时南桥也通常给PCI总线提供系统复位信号,时钟信号和错误报告信号。这个是PIC桥一般的设计,图中分在上下所以叫南北桥。
在这里插入图片描述

二、PCIE简介

  PCIe,英文缩写为PCIe或者PCI Express,一般用于CPU与外部设备进行高速连接(GPU,声卡)。PCIe是点对点,全双工的差分传输信号总线,基于数据包协议传输。点对点互连表示链路上的电气负载有限,从而使发送和接收频率可扩展到更高。PCIe目前成熟的版本有GEN1,GEN2,GEN3,GEN4和GEN5,每一代相较上一代传输速率和传输带宽都有了很大幅度的提升。

  1. 点对点传输 :每一个设备是对于一条完整的总线
  2. 差分传输: 每个信号由一对差分信号压差来表示:D+和D-之间电压差为正表示1,D+和D-之间的电压差为负表示0。
  3. 通信协议帧传输:分为三层协议–事务层、数据链路层、物理层
  4. 链路(Links):PCIe设备之间的信号传输路径称作链路(Links),一个Links由一个或多个收发通道(Lanes)组成
  5. 收发通道(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,链路训练状态机),负责进行链路初始化以及训练。
### PCIe技术规范 Peripheral Component Interconnect Express (PCIe) 是一种用于附加硬件组件的高速串行计算机扩展总线标准[^1]。相比于传统的并行PCI总线,PCIe采用了点对点串行链接的方式,这不仅提高了数据传输的速度,还减少了信号间的干扰。 #### 版本演进 自推出以来,PCIe经历了多次迭代更新: - **PCIe 1.0**: 提供了2.5 GT/s的数据速率。 - **PCIe 2.0**: 将速度翻倍至5 GT/s。 - **PCIe 3.0**: 进一步提高到了8 GT/s,并优化了链路效率。 - **后续版本**:随着需求的增长和技术的进步,更高版本如4.0、5.0甚至6.0相继发布,持续提升了性能指标。 #### 数据包结构协议栈 在PCIe通信中,事务层负责构建和解析交易层包(TLPs),这些TLP包含了命令信息以及有效载荷数据;随后通过数据链路层进行错误检测及流量控制;最后物理层实现实际比特流的发送接收过程。其中,TLP头部可能依据具体应用场景包含额外字段,比如由V2.1版引入的一个可选扩展帧头部分[^3]。 ### 应用场景 由于其卓越的带宽表现和支持多种配置选项的能力,使得PCIe广泛应用于服务器平台上的存储控制器、图形处理单元(GPU)加速卡等领域之外,还包括消费级市场中的固态硬盘(SSD)接口等重要位置上。此外,在嵌入式系统设计里也不乏见到它的身影,特别是在那些对于实时性和高吞吐量有着严格要求的应用场合下显得尤为重要。 ```python # Python代码示例展示如何查询当前系统的PCIe设备列表 import os def list_pci_devices(): devices = [] pci_path = "/sys/bus/pci/devices" if not os.path.exists(pci_path): print("No PCI directory found.") return for device_dir in os.listdir(pci_path): with open(os.path.join(pci_path, device_dir, 'device'), 'r') as f: vendor_id = f.read().strip() with open(os.path.join(pci_path, device_dir, 'vendor'), 'r') as f: device_id = f.read().strip() devices.append({ "Device": device_dir, "Vendor ID": vendor_id, "Device ID": device_id }) return devices if __name__ == "__main__": pcie_dev_list = list_pci_devices() for dev_info in pcie_dev_list: print(dev_info) ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

伊丽莎白鹅

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值