1. DMA 基础概念
1.1 DMA 工作原理
直接存储器访问(Direct Memory Access, DMA)是一种允许硬件设备直接读写系统内存而无需 CPU 干预的数据传输技术。DMA 控制器作为总线上的独立主控设备,在传输期间接管总线控制权,完成从源地址到目的地址的数据搬运。
核心要点:DMA 的本质是“硬件线程搬运数据”,CPU 只需配置传输参数并等待完成中断,无需逐字节参与。
1.2 DMA 与 CPU 数据搬运对比
传统 PIO(Programmed I/O)模式下,CPU 通过循环读取/写入寄存器完成每个字节的搬运;DMA 模式下,CPU 仅参与配置和收尾。两者在性能、资源占用和延迟特性上有本质区别。
| 对比维度 | CPU 直接搬运(PIO) | DMA 搬运 |
|---|---|---|
| 参与方式 | 逐字节/逐字循环搬运 | 仅配置启动 + 等待完成中断 |
| CPU 占用率 | 100%(搬运期间无法执行其他任务) | 接近 0%(搬运期间可调度其他任务) |
| 传输速率 | 受限于 CPU 主频与指令吞吐 | 接近总线带宽上限 |
| 适用数据量 | 小数据块(< 64 字节) | 大数据块(≥ 64 字节,典型 1KB+) |
| 实时性影响 | 阻塞 CPU,中断延迟增大 | 非阻塞,中断延迟稳定 |
| 功耗 | CPU 高频运行,功耗高 | DMA 低时钟运行,整体功耗低 |
| 代码复杂度 | 简单循环,无需额外硬件 | 需 DMA 驱动、中断处理、缓存同步 |
经验法则:在嵌入式 Linux 中,单次传输量小于 64 字节时 PIO 可能更快(省去 DMA 配置开销);超过 256 字节时 DMA 优势明显。驱动开发中建议将阈值设为 256 字节。
1.3 DMA 传输的优势与适用场景
核心优势
- CPU 卸载:将数据搬运任务从 CPU 卸载到专用硬件,CPU 可并行处理协议解析、控制逻辑等高价值任务。
- 高吞吐:DMA 控制器以硬件状态机驱动地址递增和传输计数,时钟周期利用率远高于软件循环。
- 低延迟抖动:DMA 传输不依赖 CPU 调度,完成时间可预测,适合音频、视频等实时流。
- 功耗优化:DMA 控制器通常在较低频率下运行,CPU 可进入低功耗模式,整体能效比提升 3~10 倍。
典型适用场景
| 场景 | 说明 | 典型数据量 |
|---|---|---|
| 高速外设数据采集 | ADC、摄像头、麦克风等连续采样,DMA 直接写入内存环形缓冲区 | KB ~ MB 级 |
| 显示帧缓冲更新 | LCD/OLED 控制器通过 DMA 从帧缓冲取数据刷新屏幕 | 数百 KB ~ 数 MB |
| 存储设备读写 | eMMC、SD 卡、NAND Flash 的块数据传输 | 512B ~ 数 MB |
| 网络数据包收发 | 以太网 MAC 通过 DMA 将数据包搬入/搬出描述符环 | 64B ~ 1518B(以太网帧) |
| 内存到内存拷贝 | 大型数据缓冲区复制、加密/校验前的数据搬移 | MB 级 |
| 音频流播放/录制 | I2S 接口通过 DMA 循环搬运音频样本 | 每帧数百字节,持续流 |
重要提醒:DMA 并非万能方案。在以下情况应谨慎使用或避免 DMA:
• 传输量极小且频繁(配置开销超过传输收益)
• 外设不支持 DMA 握手协议
• 系统无硬件缓存一致性协议(需软件维护 cache 同步)
• 实时性要求极高且 DMA 中断延迟不可控
• 传输量极小且频繁(配置开销超过传输收益)
• 外设不支持 DMA 握手协议
• 系统无硬件缓存一致性协议(需软件维护 cache 同步)
• 实时性要求极高且 DMA 中断延迟不可控
1.4 关键术语速查
| 术语 | 全称 | 简要说明 |
|---|---|---|
| DMA | Direct Memory Access | 直接存储器访问,硬件自主搬运数据 |
| PIO | Programmed I/O | 编程 I/O,CPU 逐字节搬运 |
| Bus Master | 总线主控 | DMA 控制器作为主控设备驱动总线 |
| Scatter-Gather | 分散-聚集 | DMA 支持非连续内存块链式传输 |
| Cache Coherency | 缓存一致性 | DMA 与 CPU 缓存数据同步问题 |
| DMA Descriptor | DMA 描述符 | 描述传输源、目的、长度的控制结构 |