1. DMA基础概念:什么是DMA、DMA与CPU数据搬运的区别、DMA在嵌入式系统中的作用

1.1 什么是DMA

DMA(Direct Memory Access,直接存储器访问) 是一种允许硬件设备(如网卡、硬盘控制器、声卡、摄像头接口等)直接读写系统内存,而无需CPU干预的数据传输技术。DMA的核心思想是将数据搬运任务从CPU卸载到专用的DMA控制器(DMAC)或支持DMA功能的外设上,从而释放CPU去执行更重要的计算和控制任务。

关键理解: DMA不是一种“加速”技术,而是一种“卸载”技术。它不改变数据传输的物理带宽上限,但通过消除CPU的逐字节搬运开销,显著提升系统的整体吞吐量和实时响应能力。
DMA系统架构图 CPU (控制/计算) DMA控制器 (DMAC) 系统内存 (DRAM) 外设 (网卡/硬盘/声卡) 配置/启动 数据总线 请求/应答 直接数据通路 DMA控制器接管数据搬运,CPU仅需配置源地址、目的地址和传输长度即可

1.2 DMA与CPU数据搬运的核心区别

传统的数据搬运方式(PIO,Programmed I/O)由CPU逐字或逐字节地从外设读取数据并写入内存,或反向操作。DMA方式则将这一过程完全交由硬件自动完成。下表从多个维度对比两种方式的差异:

对比维度 CPU搬运(PIO模式) DMA搬运
执行主体 CPU核心(逐指令执行) DMA控制器(硬件状态机)
CPU占用率 高(100%占用直到传输完成) 低(仅初始化配置和完成中断)
传输速率 受限于CPU主频和指令吞吐 接近总线带宽(如AXI/PCIe)
适用场景 小数据量(< 64字节)、控制寄存器访问 大数据块(≥ 1KB)、流式数据(音视频/网络)
实时性影响 阻塞CPU,影响中断响应和任务调度 非阻塞,CPU可并行处理其他任务
功耗 较高(CPU持续活跃) 较低(CPU可进入低功耗模式)
编程复杂度 简单(直接读写寄存器) 中等(需配置DMA描述符、处理缓存一致性)
实战经验: 在嵌入式Linux驱动开发中,一个常见的性能陷阱是驱动编写者为了简化代码,使用PIO方式搬运超过1KB的数据块。这会导致CPU被长时间占用,系统中断延迟飙升,甚至引发音频卡顿或网络丢包。正确的做法是:小于64字节用PIO,大于1KB必须用DMA。
CPU搬运 vs DMA搬运 流程对比 CPU搬运(PIO模式) ① CPU读取外设数据寄存器 ② CPU将数据写入内存 ③ 重复①~②直到传输完成 ④ CPU被阻塞,无法响应其他任务 DMA搬运 ① CPU配置DMA描述符(源/目的/长度) ② CPU启动DMA后立即返回 ③ DMA硬件自动搬运数据(CPU空闲) ④ DMA完成中断通知CPU

1.3 DMA在嵌入式系统中的作用

在嵌入式系统中,DMA的作用远不止“加速数据搬运”这么简单。它直接关系到系统的实时性、功耗和架构设计。以下是DMA在嵌入式系统中的五大核心作用:

  1. 解放CPU,提升系统吞吐量:在高速数据采集(如ADC采样、摄像头ISP)、网络收发(Gigabit Ethernet)、存储读写(eMMC/SDIO)等场景中,DMA使CPU从繁重的数据搬运中解脱出来,专注于协议栈处理、算法运算和任务调度。
  2. 降低中断频率,减少上下文切换开销:PIO模式下每传输一个字节或一个字都可能触发一次中断;DMA模式下,一次中断可对应整个数据块(如4KB),中断频率降低数百倍。
  3. 支持低功耗设计:DMA传输期间CPU可以进入WFI(Wait For Interrupt)或深度睡眠模式,对于电池供电的IoT设备至关重要。
  4. 实现外设到外设的直接传输:某些DMA控制器支持内存到内存、外设到外设的传输,例如将音频I2S接口的数据直接搬运到SPI DAC,无需经过内存中转。
  5. 保证数据传输的确定性和实时性:DMA控制器以硬件状态机运行,传输延迟可预测(通常为固定总线周期),不受CPU任务调度和缓存命中率的影响。
DMA在嵌入式系统中的五大作用 DMA控制器 (硬件数据搬运引擎) 解放CPU 提升系统吞吐量 降低中断频率 减少上下文切换 支持低功耗 CPU可进入睡眠 外设直通传输 无需内存中转 确定性与实时性 硬件状态机,延迟可预测 在嵌入式Linux驱动开发中,DMA是高性能驱动(网卡、存储、多媒体)的必备技术

1.4 DMA传输的基本流程

理解DMA传输的基本流程,是后续学习 dma_map_single 和缓存同步的基础。一个典型的DMA传输包含以下五个阶段:

阶段 操作 参与者 说明
1. 申请缓冲区 分配DMA可用内存(物理连续或通过IOMMU映射) CPU / 驱动 使用 dma_alloc_coherent 或 kmalloc + dma_map_single
2. 配置描述符 设置源地址、目的地址、传输长度、传输方向 CPU 写入DMA控制器的寄存器或描述符链表
3. 启动传输 使能DMA通道,触发传输开始 CPU 写控制寄存器,或通过外设请求信号触发
4. 硬件搬运 DMA控制器自动从源读取数据并写入目的 DMA控制器 CPU可并行执行其他代码,或进入低功耗模式
5. 传输完成 DMA控制器产生中断,CPU处理完成事件 DMA → CPU 驱动在中断处理中检查状态、释放资源、通知上层
常见误区: 初学者常认为DMA传输完成后,CPU可以直接访问缓冲区中的数据。但在带缓存(Cache)的CPU架构中,DMA直接读写物理内存,而CPU可能从Cache中读取旧数据,导致数据不一致。这正是本课程后续重点讲解 dma_map_single 和缓存同步操作的根本原因。

1.5 本章小结

  • DMA 是一种硬件数据搬运技术,将CPU从逐字节的数据传输中解放出来。
  • CPU搬运 vs DMA搬运:核心区别在于执行主体和CPU占用率,DMA适用于大数据块传输场景。
  • 嵌入式系统中的作用:提升吞吐量、降低中断频率、支持低功耗、实现外设直通、保证实时性。
  • DMA传输五阶段:申请缓冲区 → 配置描述符 → 启动传输 → 硬件搬运 → 完成中断。
  • 缓存一致性问题:是DMA驱动开发的核心难点,下一章将深入分析Cache与DMA的交互机制。