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则采用串行点对点交换架构,每个设备拥有专用通道,从根本上消除了并行总线的信号反射和时钟偏移问题。
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字节的配置寄存器,用于设备识别、资源分配和状态控制。
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及之后),通用卡支持双电压。
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)。
- 请求阶段: 设备需要总线时,拉低REQ#信号。
- 授权阶段: 仲裁器在下一个时钟周期拉低对应GNT#,表示授权。
- 事务启动: 设备检测到GNT#有效后,在空闲总线(FRAME#和IRDY#均为高)上启动事务。
- 隐式释放: 设备可在事务中间释放GNT#,允许仲裁器提前授权下一个设备。
总线主控(Bus Master)与DMA的关系: 设备必须通过Command寄存器中的Bus Master Enable(BME)位使能总线主控功能,才能主动发起PCI总线事务(包括DMA读写)。这正是本课程的核心主题——
pci_set_master()函数的作用就是设置该位,使设备具备DMA传输能力。