PCIe总线主控配置与DMA传输性能调优 - 第1节

1.1 PCI总线的发展历史

PCI(Peripheral Component Interconnect)总线由Intel于1992年提出,旨在替代ISA/EISA总线,解决处理器与外围设备之间的数据传输瓶颈。PCI总线经历了从并行到串行、从共享到点对点的演进过程。

阶段 时间 关键特性 带宽
PCI 1.0 1992 32位/33MHz,并行共享总线 133 MB/s
PCI 2.x 1995 64位扩展,66MHz支持,5V/3.3V双电压 533 MB/s
PCI-X 1999 64位/133MHz,服务器领域 1.06 GB/s
PCI Express 1.0 2003 串行差分信号,点对点拓扑,x1/x4/x8/x16 2.5 GT/s(每通道)
PCI Express 4.0 2017 16 GT/s,支持SR-IOV,CXL基础 31.5 GB/s(x16)
关键认知: 传统PCI总线是共享并行总线,所有设备挂在同一组信号线上,通过仲裁获得总线控制权。PCI Express则采用串行点对点交换架构,每个设备拥有专用通道,从根本上消除了并行总线的信号反射和时钟偏移问题。
PCI总线发展历程时间线 PCI 1.0 1992 PCI 2.x 1995 PCI-X 1999 PCIe 1.0 2003 PCIe 4.0 2017 并行总线 → 串行差分信号 | 共享仲裁 → 点对点交换 | 带宽从133 MB/s提升至31.5 GB/s

1.2 PCI总线的拓扑结构

传统PCI总线采用树形拓扑,由PCI桥接器(PCI Bridge)连接多个PCI总线段,每个总线段上可挂载多个PCI设备。PCI桥接器负责总线之间的地址路由和事务转发。

1.2.1 拓扑层次结构

  • 根复合体(Root Complex): 连接CPU/内存与PCI层次结构,通常集成在北桥或SoC中。
  • PCI桥接器(PCI-to-PCI Bridge): 扩展PCI总线数量,实现总线分段和负载隔离。
  • PCI设备(PCI Device): 功能单元,每个设备可包含最多8个功能(Function)。
  • 配置空间(Configuration Space): 每个功能拥有256字节的配置寄存器,用于设备识别、资源分配和状态控制。
PCI总线拓扑结构 CPU / 内存控制器 根复合体 PCI总线 0(主总线) 网卡 (Device 0) 显卡 (Device 1) PCI桥接器 PCI总线 1(次级总线) SCSI控制器 USB控制器

1.2.2 配置空间与设备枚举

系统上电后,BIOS或内核通过配置空间访问机制(CF8/CFC I/O端口)遍历PCI总线树,为每个设备分配总线号、设备号和功能号(BDF)。配置空间的前64字节是标准头部,包含Vendor ID、Device ID、Class Code、BAR(基地址寄存器)等关键字段。

偏移 寄存器 位宽 描述
0x00 Vendor ID 16位 厂商编号(如Intel 0x8086)
0x02 Device ID 16位 设备型号编号
0x04 Command 16位 控制I/O空间、内存空间、总线主控使能等
0x08 Class Code 24位 设备分类(网卡、存储、显示等)
0x10-0x24 BAR0-BAR5 32位×6 基地址寄存器,映射I/O或内存空间
0x3C Interrupt Line 8位 中断号分配
设备枚举流程: 内核遍历总线0 → 读取每个设备的Vendor ID(非0xFFFF表示存在)→ 读取Class Code判断设备类型 → 读取BAR确定资源需求 → 分配地址空间 → 写入Command寄存器使能I/O/内存/主控。

1.3 PCI总线的电气特性

传统PCI总线是同步并行总线,所有信号与时钟同步。电气特性直接影响信号完整性、传输速率和系统稳定性。

1.3.1 信号定义与分组

  • 地址/数据复用线(AD[31:0]): 分时复用,先传地址后传数据。
  • 控制信号: FRAME#(帧开始)、IRDY#(主设备就绪)、TRDY#(目标就绪)、DEVSEL#(设备选择)等。
  • 仲裁信号: REQ#(请求总线)、GNT#(获得总线),每个主设备独立一对。
  • 时钟(CLK): 33MHz或66MHz,同步所有事务。
  • 电源: 5V(PCI 2.0及之前)或3.3V(PCI 2.1及之后),通用卡支持双电压。
PCI总线信号分组 时钟组 CLK, RST# 地址/数据组 AD[31:0], C/BE#[3:0] 控制组 FRAME#, IRDY#, TRDY# 仲裁组 REQ#, GNT# 电气特性关键参数 • 信号电平:TTL兼容,5V/3.3V,高电平≥2.0V,低电平≤0.8V • 负载能力:每个PCI总线最多挂载10个负载(含连接器) • 信号反射:并行总线存在反射问题,需端接电阻和走线长度匹配 • 时序约束:AD线在CLK上升沿采样,建立时间≥7ns,保持时间≥0ns

1.3.2 总线事务与时序

PCI总线事务由地址阶段和数据阶段组成。主设备(Initiator)通过FRAME#信号启动事务,目标设备(Target)通过DEVSEL#响应。每个数据段可以插入等待周期(通过IRDY#和TRDY#控制)。

电气设计注意事项: 传统PCI总线的并行结构限制了频率提升(最高66MHz),且信号反射、串扰、时钟偏移等问题随频率升高急剧恶化。这是PCI被PCI Express取代的根本原因。在嵌入式系统中,如果仍使用传统PCI,必须严格遵循走线长度匹配和端接规范。

1.3.3 总线仲裁机制

PCI总线采用集中式仲裁,每个主设备有独立的REQ#/GNT#对连接到仲裁器(通常集成在北桥或PCI桥中)。仲裁算法可以是轮询(Round-Robin)或优先级(Priority-based)。

  1. 请求阶段: 设备需要总线时,拉低REQ#信号。
  2. 授权阶段: 仲裁器在下一个时钟周期拉低对应GNT#,表示授权。
  3. 事务启动: 设备检测到GNT#有效后,在空闲总线(FRAME#和IRDY#均为高)上启动事务。
  4. 隐式释放: 设备可在事务中间释放GNT#,允许仲裁器提前授权下一个设备。
总线主控(Bus Master)与DMA的关系: 设备必须通过Command寄存器中的Bus Master Enable(BME)位使能总线主控功能,才能主动发起PCI总线事务(包括DMA读写)。这正是本课程的核心主题——pci_set_master()函数的作用就是设置该位,使设备具备DMA传输能力。