1. DMA 基础概念
1.1 DMA 工作原理
直接内存访问(Direct Memory Access, DMA)是一种允许硬件设备直接读写系统内存而无需 CPU 逐字节参与的数据传输机制。在 DMA 传输过程中,CPU 只需初始化传输参数(源地址、目的地址、传输长度),随后由 DMA 控制器接管总线控制权,完成数据搬运,最后通过中断通知 CPU 传输结束。
核心要点:DMA 将 CPU 从繁重的数据拷贝任务中解放出来,使 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 传输的上限速率。
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,因此驱动开发者需要根据传输粒度合理选择。
1.4 小结
- DMA 工作原理:CPU 配置描述符 → DMA 控制器自主搬运数据 → 中断通知完成,实现 CPU 卸载。
- PCIe 中的角色:DMA 是外设与系统内存之间的高速数据通道,依赖 PCIe TLP 完成内存读写。
- 核心优势:高带宽、低 CPU 占用、适合批量传输,是现代高性能驱动的基础设施。