1. DMA基础概念:什么是DMA、DMA与CPU数据搬运的区别、DMA在嵌入式系统中的作用
1.1 什么是DMA
DMA(Direct Memory Access,直接存储器访问) 是一种允许硬件设备(如网卡、硬盘控制器、声卡、摄像头接口等)直接读写系统内存,而无需CPU干预的数据传输技术。DMA的核心思想是将数据搬运任务从CPU卸载到专用的DMA控制器(DMAC)或支持DMA功能的外设上,从而释放CPU去执行更重要的计算和控制任务。
关键理解: 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。
1.3 DMA在嵌入式系统中的作用
在嵌入式系统中,DMA的作用远不止“加速数据搬运”这么简单。它直接关系到系统的实时性、功耗和架构设计。以下是DMA在嵌入式系统中的五大核心作用:
- 解放CPU,提升系统吞吐量:在高速数据采集(如ADC采样、摄像头ISP)、网络收发(Gigabit Ethernet)、存储读写(eMMC/SDIO)等场景中,DMA使CPU从繁重的数据搬运中解脱出来,专注于协议栈处理、算法运算和任务调度。
- 降低中断频率,减少上下文切换开销:PIO模式下每传输一个字节或一个字都可能触发一次中断;DMA模式下,一次中断可对应整个数据块(如4KB),中断频率降低数百倍。
- 支持低功耗设计:DMA传输期间CPU可以进入WFI(Wait For Interrupt)或深度睡眠模式,对于电池供电的IoT设备至关重要。
- 实现外设到外设的直接传输:某些DMA控制器支持内存到内存、外设到外设的传输,例如将音频I2S接口的数据直接搬运到SPI DAC,无需经过内存中转。
- 保证数据传输的确定性和实时性:DMA控制器以硬件状态机运行,传输延迟可预测(通常为固定总线周期),不受CPU任务调度和缓存命中率的影响。
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的交互机制。