1. DMA 基础概念

1.1 DMA 工作原理

直接内存访问(Direct Memory Access, DMA)是一种允许硬件设备直接读写系统内存而无需 CPU 逐字节参与的数据传输机制。在 DMA 传输过程中,CPU 只需初始化传输参数(源地址、目的地址、传输长度),随后由 DMA 控制器接管总线控制权,完成数据搬运,最后通过中断通知 CPU 传输结束。

核心要点:DMA 将 CPU 从繁重的数据拷贝任务中解放出来,使 CPU 可以并行执行计算、调度等更高层次的工作。
DMA 传输基本流程 CPU 初始化 DMA DMA 控制器 接管总线控制权 系统内存 数据缓冲区 PCIe 外设 发起 DMA 请求 ① 配置描述符 ② DMA 请求 ③ 数据传输 ④ 传输完成中断 说明: CPU 只在①和④阶段参与,②③阶段完全由 DMA 控制器自主完成,实现真正的 CPU 卸载。

1.2 DMA 在 PCIe 系统中的角色

在 PCIe 子系统中,DMA 是连接外设与系统内存的核心数据通道。PCIe 设备(如网卡、NVMe 固态盘、GPU)通过 DMA 将数据直接送入或取出系统内存,避免数据经过 CPU 寄存器或临时缓冲区的低效路径。

角色 说明 典型场景
数据生产者 外设通过 DMA 将采集/接收的数据写入内存 网卡接收网络包、采集卡捕获视频
数据消费者 外设通过 DMA 从内存读取待处理/待发送的数据 GPU 读取纹理数据、NVMe 读取磁盘缓存
描述符搬运者 DMA 引擎处理描述符环,实现批量传输调度 MSI-X 中断驱动的多队列 DMA
地址翻译器 通过 IOMMU/SMMU 将设备可见地址映射到物理内存 虚拟化环境中的设备直通(VFIO)
PCIe 与 DMA 的协同:PCIe 的 TLP(事务层包)天然支持 Memory Read/Write 请求,DMA 控制器正是利用这些 TLP 完成对系统内存的访问。PCIe 的带宽(如 Gen4 x16 约 32 GB/s)直接决定了 DMA 传输的上限速率。
PCIe 系统中的 DMA 数据流 系统内存 DMA 缓冲区 描述符环 Root Complex PCIe 总线接口 地址翻译/路由 PCIe Switch 数据包交换 NVMe SSD DMA 引擎 网卡 (NIC) DMA 引擎 MemRd/MemWr TLP 路由 TLP TLP DMA 引擎通过 PCIe TLP 中的 Memory Write/Read 请求直接访问系统内存,Root Complex 负责地址翻译和路由,Switch 负责数据包分发。

1.3 DMA 传输的优势

与传统的 PIO(Programmed I/O)方式相比,DMA 在性能、CPU 利用率、吞吐量等方面具有显著优势。以下从多个维度进行对比:

对比维度 PIO(程序控制 I/O) DMA(直接内存访问)
CPU 参与度 每个数据字都需要 CPU 执行 load/store 指令 CPU 仅参与初始化与完成处理,传输过程不参与
传输速率 受限于 CPU 时钟和指令吞吐,通常 < 1 GB/s 可达 PCIe 链路带宽上限(如 32 GB/s)
CPU 利用率 传输期间 CPU 被完全占用,无法执行其他任务 CPU 可并行处理其他进程或中断服务
大数据块效率 数据量越大,CPU 开销线性增长 批量传输,单次描述符可处理 MB 级数据
系统功耗 CPU 高频运转,功耗高 CPU 可进入低功耗状态,整体能效更优
适用场景 少量控制寄存器访问、状态查询 批量数据搬运(网络、存储、视频、AI 推理)
注意:DMA 并非没有代价。它需要额外的 DMA 控制器硬件、描述符管理逻辑、中断处理以及缓存一致性维护。在极短数据(如几十字节)场景下,DMA 的初始化开销可能超过 PIO,因此驱动开发者需要根据传输粒度合理选择。
PIO vs DMA 传输效率对比(定性) PIO DMA CPU 开销 传输数据量 小数据量 差距不大 大数据量 DMA 优势显著 纵轴为 CPU 开销(越低越好),横轴为传输数据量。DMA 在数据量增大时 CPU 开销增长平缓,而 PIO 呈近似线性增长。

1.4 小结

  • DMA 工作原理:CPU 配置描述符 → DMA 控制器自主搬运数据 → 中断通知完成,实现 CPU 卸载。
  • PCIe 中的角色:DMA 是外设与系统内存之间的高速数据通道,依赖 PCIe TLP 完成内存读写。
  • 核心优势:高带宽、低 CPU 占用、适合批量传输,是现代高性能驱动的基础设施。