为什么需要理解架构全貌?

在开始学习PCIe之前,了解整个系统的软硬件架构非常重要。很多初学者容易混淆不同的开发方向,例如:

常见误区

有人花了很多时间学习"PCIe设备驱动开发",结果入职后发现部门需要的是"RC控制器驱动开发"——这是两个完全不同的方向!

设备驱动开发:运行在RC侧系统中,用于驱动连接在PCIe总线上的EP设备(如NVMe SSD、网卡)

RC控制器驱动开发:属于RC硬件的软件栈,负责初始化RC硬件、枚举设备、提供配置空间访问接口

本页面将帮助你建立完整的PCIe软硬件架构认知,明确各种开发方向的职责边界。

PCIe 软硬件架构全景图

下图展示了一个典型的PCIe系统架构,包含Root Complex、Switch和Endpoint,以及各层的软件栈、数据流和中断路径。

应用层
用户应用程序
NVMe工具、网卡配置工具等
内核驱动层
PCIe设备驱动
NVMe驱动、网卡驱动、GPU驱动等
Linux PCI子系统
PCI Core、设备模型、资源管理
控制器驱动层
RC控制器驱动
Host Bridge驱动、ECAM、枚举逻辑
DMA数据传输路径
中断信号路径
配置空间访问
硬件层
Root Complex
RC控制器硬件、Root Ports
RP0
RP1
PCIe Switch
可选,端口扩展
Upstream
DS1
DS2
Endpoint
NVMe/GPU/NIC等
EP Port

中断路径

INTx
EPSwitchRCIO-APICCPU
MSI/MSI-X
EPMemory Write TLPRCCPU

DMA数据传输路径

DMA Read
EPMRd TLPRCMemoryCplDEP
DMA Write
EPMWr TLPRCMemory
EP固件层
EP固件
设备特定功能实现
EP控制器层
EP控制器驱动/固件
配置空间处理、DMA引擎
RC侧组件 EP侧组件 Switch组件

三大开发方向详解

RC控制器驱动开发
Root Complex Controller Driver Development

RC控制器驱动运行在Root Complex所在的系统中(通常是CPU/SoC侧),负责初始化RC硬件、枚举PCIe设备、提供配置空间访问接口。这是PCIe子系统的"基础设施"。

核心职责
  • 初始化RC控制器硬件
  • 配置ECAM(增强配置访问机制)
  • 实现设备枚举逻辑
  • 分配Bus/Device/Function号
  • 配置PCIe域和总线范围
  • 处理AER错误报告
典型工作场景
  • SoC厂商开发新芯片的PCIe RC
  • 移植Linux内核到新硬件平台
  • 调试PCIe链路训练问题
  • 修复设备枚举失败问题
  • 实现热插拔支持
需要掌握的知识
  • PCIe规范(配置空间、枚举流程)
  • Linux内核PCI子系统架构
  • 设备树(Device Tree)
  • ACPI(x86平台)
  • ECAM机制
相关内核模块
  • drivers/pci/controller/
  • drivers/pci/host/
  • drivers/acpi/pci_root.c
  • drivers/pci/probe.c
PCIe设备驱动开发
PCIe Device Driver Development

PCIe设备驱动运行在RC侧的操作系统中,用于驱动连接在PCIe总线上的Endpoint设备。这是最常见的PCIe相关开发方向。

核心职责
  • 实现probe/remove回调
  • 映射设备寄存器(MMIO)
  • 实现DMA数据传输
  • 处理设备中断(MSI/MSI-X)
  • 实现用户空间接口
  • 电源管理(suspend/resume)
典型工作场景
  • 开发NVMe SSD驱动
  • 开发高速网卡驱动
  • 开发AI加速卡驱动
  • 开发FPGA卡驱动
  • 开发视频采集卡驱动
需要掌握的知识
  • Linux驱动开发框架
  • DMA编程(一致性/流式)
  • 中断处理机制
  • 并发和锁机制
  • 设备特定协议(如NVMe)
典型驱动示例
  • drivers/nvme/host/
  • drivers/net/ethernet/
  • drivers/gpu/drm/
  • drivers/uio/
EP侧固件/驱动开发
Endpoint Firmware/Driver Development

EP侧开发运行在Endpoint设备上(如NVMe控制器、FPGA),负责实现设备特定功能和PCIe EP控制器配置。这是一个相对小众但专业的方向。

核心职责
  • 配置EP控制器硬件
  • 设置配置空间寄存器
  • 实现BAR空间映射
  • 处理RC发来的请求
  • 实现DMA引擎控制
  • 发送MSI/MSI-X中断
典型工作场景
  • FPGA PCIe IP核开发
  • NVMe控制器固件开发
  • 智能网卡固件开发
  • PCIe测试设备开发
  • 嵌入式PCIe设备开发
需要掌握的知识
  • PCIe规范(EP角色)
  • EP控制器IP核(如Xilinx PCIe IP)
  • 裸机或RTOS开发
  • 配置空间布局
  • 中断发送机制
常用开发平台
  • Xilinx PCIe IP核
  • Intel PCIe IP核
  • Synopsys PCIe控制器
  • ARM CoreLink PCIe

不同角色的开发对比

RC控制器开发者
  • 运行位置:RC侧系统
  • 开发对象:RC控制器硬件
  • 目标:让PCIe总线工作起来
  • 典型雇主:SoC厂商、CPU厂商
  • 难度:★★★★☆
  • 市场需求:相对较少
PCIe设备驱动开发者
  • 运行位置:RC侧系统
  • 开发对象:EP设备
  • 目标:让EP设备发挥作用
  • 典型雇主:设备厂商、云厂商
  • 难度:★★★☆☆
  • 市场需求:量大,最常见
EP固件开发者
  • 运行位置:EP侧系统
  • 开发对象:EP控制器+功能逻辑
  • 目标:实现设备功能
  • 典型雇主:设备厂商、FPGA公司
  • 难度:★★★★☆
  • 市场需求:小众但专业

学习路径建议

通用基础路径
所有PCIe开发者都需要掌握
推荐学习顺序
  1. 理解拓扑结构:RC、Switch、Endpoint的关系
  2. 协议分层:事务层、数据链路层、物理层的职责
  3. 配置空间:如何发现和配置设备
  4. LTSSM:链路是如何建立起来的
  5. TLP/DLLP:数据是如何传输的
  6. 中断机制:MSI/MSI-X的工作原理

本网站内容导航

基于上述架构,本网站目前涵盖的内容如下:

页面 内容 适用方向
基础知识 拓扑结构、协议分层、事务类型、流量控制 所有方向
配置空间 寄存器布局、能力结构、访问方法 所有方向
LTSSM状态机 链路训练过程、状态转换 RC驱动、EP固件
PHY架构 SerDes、编码、均衡、信号完整性 硬件相关方向
软件开发 Linux驱动开发、DMA、中断处理 设备驱动
交互工具 带宽计算、TLP构造、配置解析 所有方向

待补充内容

本网站仍在建设中,以下内容计划补充:

  • RC控制器驱动开发详解
  • EP固件开发指南
  • Switch工作原理
  • PCIe热插拔机制
  • 虚拟化中的PCIe(SR-IOV、vGPU)
  • CXL(Compute Express Link)简介

声明

本页面内容由AI辅助整理,基于PCIe规范和Linux内核文档整理而成,仅供学习参考。 内容可能存在错误或不准确之处,欢迎读者指正。实际开发请以官方规范和文档为准。