DMA方式

义项:直接存储器访问
DMA方式

DMA方式是计算机系统中一种由专用硬件在外设与主存储器之间直接成块搬运数据、传输过程不需处理器逐字干预的输入输出方式,全称直接存储器访问(Direct Memory Access,DMA)[1]。它把处理器从重复的数据搬运中解放出来,使传输速率主要受存储器与外设速度限制[2]。处理器只在传输前后做初始化和收尾工作,适合磁盘等高速大批量数据交换的场合[3]。

目录
  1. 定义
  2. 原理
  3. 发展历程
  4. 应用
  5. 局限
  6. 参见

定义

DMA方式指依靠专门的DMA控制器,在不执行程序指令的情况下于主存储器和输入输出设备之间直接传送数据块的工作方式[2]。在这种方式下,DMA控制器从处理器手中暂时取得总线的控制权,数据经由数据总线在存储器与设备间直接流动,不经过处理器中转[3]。

它与程序查询方式、程序中断方式并列,属于处理器与外设交换信息的第三种基本控制方式;前两种方式的数据传送都要由处理器执行程序完成,而DMA方式的数据传送完全由硬件实现[4]。因此在大批量数据搬运时,DMA方式的速率远高于前两者[5]。

DMA控制器本身具有两重身份:工作时它接管总线,像处理器一样成为总线的主控设备;处理器对它写入或读取控制寄存器时,它又表现为总线上的从属设备[5]。

原理

一次完整的DMA传送通常分为预处理、数据传送和传送后处理三个阶段。预处理阶段由处理器用几条输入输出指令设置设备号、内存起始地址和数据个数,随后继续执行主程序。

传送过程可概括为请求、响应、传输、结束四个环节:外设经接口向DMA控制器发出请求,DMA控制器向处理器提出总线请求;处理器以总线响应信号作答并让出总线;DMA控制器随后自行输出读写命令并维护地址与计数;计数归零后发出结束信号并交还总线[5]。最后处理器在中断服务程序中校验数据、检查传送是否出错[6]。

处理器与DMA控制器分时使用存储器一般有三种办法:停止处理器访存、周期挪用(也称周期窃取)以及两者交替访存[6]。周期挪用指DMA在处理器不访存的空隙中使用总线,两者同时请求访存时由DMA优先[6]。以TI的一款微控制器为例,其DMA控制器可在处理器不介入的情况下把数据从一个存储器地址搬到另一个地址,例如把模数转换器的转换结果移入SRAM,并支持7个独立通道[7]。

按触发方式划分,DMA传输可由软件启动,也可由外设的请求信号启动;传输的基本单位小到字节,大到成块数据[1]。部分控制器采用乒乓缓冲模式,在一块数据传完时自动切换到另一块起始地址,以便连续采集不中断[1]。

发展历程

DMA的思路可追溯到20世纪50年代末期的大型计算机,当时已出现用专用硬件替代处理器搬运存储器与外设间数据的做法。20世纪70至80年代微型计算机普及后,独立的DMA控制芯片随之商用,DMA成为标准概念。

早期个人计算机多使用Intel 8237一类独立芯片作为DMA控制器:它是4通道、8位、16位寻址的器件,单通道可寻址64KB内存,传输速率最高约1.6MB/s[8]。IBM PC与PC XT各用一片8237,其中第0通道被用于动态存储器刷新;PC AT则增加第二片8237以级联方式扩展到7个通道,提供16位传输[9]。8237支持单字节、成块、按需和级联四种传输模式,并能执行存储器到存储器的传送[9]。

此后DMA控制器逐步由独立芯片转为集成在芯片组、存储设备和网卡内部的功能模块,即通常所说的DMA引擎。DMA还延伸到网络领域:1993年惠普的工程师在一项专利中确立了远程直接存储器访问(RDMA)的基本思路,使联网系统可以不经对端处理器和操作系统直接读写对方内存[10]。InfiniBand贸易协会于1999年成立,2000年发布的InfiniBand体系结构规范把RDMA作为核心特性[11]。

应用

DMA方式最初用于磁盘等高速外设与内存之间的批量数据交换,后来扩展到存储器与存储器之间、外设与外设之间的传送,配备DMA控制器的单片机也实现了这种方式[5]。在嵌入式系统中,它被用于把模数转换结果搬入SRAM,或在不唤醒处理器的情况下收发串口、SPI等外设的数据,从而降低系统功耗[7]。

在通用计算机中,DMA广泛用于磁盘控制器、通信接口和高速并行接口,也见于图像采集一类需要高速扫描的场合[12]。在操作系统层面,驱动程序通过DMA接口申请一段可供设备直接访问的缓冲区,把设备可见的总线地址写入设备寄存器,再交由设备自主读写[13]。

RDMA把这一机制扩展到网络:网卡直接在主存之间搬运数据,绕开内核参与和多余的数据拷贝,可显著降低时延[11]。InfiniBand、iWARP以及基于融合以太网的RoCE都属于承载RDMA的技术路线,其中RoCE初版由InfiniBand贸易协会于2010年定义[10]。

局限

DMA方式需要额外的控制器硬件,接口和控制逻辑比程序查询方式复杂,系统成本随之上升[2]。设备数量多、传送频繁时,总线争用会占用处理器可用的访存时间;若采用停止处理器访存的办法,处理器的访存能力更是无法充分利用[6]。传送前后仍需处理器进行初始化和收尾,设备传输速率很高时这部分开销的比例会上升[14]。

DMA绕过了处理器的常规访存路径,因而带来一致性与安全问题。若设备与处理器缓存之间不保持一致,就需要在传送前后做缓存维护;在支持DMA的系统中,缺少IOMMU时,行为异常的设备可以直接改写系统存储器[15]。地址范围也存在限制,例如32位系统上Linux内核曾只能划出16MB的专用DMA内存区。

若干实现在功能上同样受限:早期8237芯片的通道每次编程最多传送64KB,且地址高位由外部锁存器另行提供,传送无法跨越64KB边界[8]。RDMA若依赖专用网络设备,部署成本较高,与既有以太网环境的兼容性也需额外考虑。

参见

  • 程序中断方式 —— 由外设发出中断请求、处理器执行服务程序完成传送的输入输出方式。

  • DMA控制器 —— 在DMA方式中接管总线、控制地址与计数的专用硬件。

  • Intel 8237 —— 早期个人计算机广泛使用的独立DMA控制器芯片。

  • IOMMU —— 对设备发起的存储器访问做地址转换与隔离的硬件单元。

  • RDMA —— 把直接存储器访问机制扩展到网络的技术。

  • 周期挪用 —— 处理器与DMA控制器分时使用存储器的常用办法。

参考资料

  1. 第22章直接存储器访问(DMA) [引用日期2026-10-29]
  2. Ch8-IO系统 [引用日期2026-10-29]
  3. 常用芯片的接口技术 [引用日期2026-10-29]
  4. 第七章习题 [引用日期2026-10-29]
  5. hxedu.com.cn 上的 PDF 文件 [引用日期2026-10-29]
  6. I/O设备与主机信息传送的方式(程序查询方式,程序中断方式,DMA方式) [引用日期2026-10-29]
  7. SLASEW9 Data sheet - PRODUCTION DATA [引用日期2026-10-29]
  8. Intel 8237 [引用日期2026-10-29]
  9. Intel 8237 [引用日期2026-10-29]
  10. How RDMA Became the Fuel for Fast Networks - Skip to content [引用日期2026-10-29]
  11. InfiniBand 是个啥? [引用日期2026-10-29]
  12. an interrupt to tell the processor that new data are ready [引用日期2026-10-29]
  13. DMA API [引用日期2026-10-29]
  14. examTab_getExam [引用日期2026-10-29]
  15. CN111133425A(PDF) [引用日期2026-10-29]
词条评价
词条统计

浏览次数:0 次

阅读量:0 次 · 阅读完成量:0 次

最近更新:2026-10-28T18:19:31Z

历史版本

本条目引用的词条
模数转换器 Intel 8237 IOMMU 程序中断方式 DMA控制器 RDMA 周期挪用