Skip to content

DMA直接存储器访问

考情分析

DMA 是 408 大题的高频考点,常与中断结合出综合题。DMA 控制器的组成、传输流程、以及 DMA 与 CPU 争用主存的三种解决方式是核心考查内容。

DMA 的基本思想

中断驱动方式中,每传送一个字/字节都要经过 CPU:设备 → CPU 寄存器 → 内存,效率受限。

DMA(Direct Memory Access)的核心思想是:数据传输不经过 CPU,由 DMA 控制器(DMAC)直接控制总线,在设备和主存之间搬运数据。

设备DMA 控制器主存(CPU 不参与数据搬运)

CPU 只在传输开始前设置 DMAC 的参数,传输完成后响应 DMAC 发出的中断。

DMA 控制器的组成

寄存器功能
AR(主存地址寄存器)存放当前传输数据在主存中的地址,每传一个字自动 +1
WC(字计数器)存放还需传输的字数,每传一个字自动 -1,减到 0 表示传输结束
DR(数据缓冲寄存器)暂存设备与主存之间传输的数据
CR(命令/状态寄存器)存放 CPU 写入的控制命令和 DMA 当前状态

另外还有中断机构(传输结束时向 CPU 发中断)和控制逻辑(总线请求、总线控制等)。

CPU                    DMA 控制器                    主存
 │── 设置 AR, WC ──→  │                              │
 │                     │←─ 数据 ─→│←─ 地址总线 ──→    │
 │                     │── 数据 ──→│── 数据总线 ──→    │
 │                     │   AR+1, WC-1                  │
 │                     │   ...(重复直到 WC=0)         │
 │←── 中断请求 ────    │                              │

DMA 传输过程

预处理阶段

CPU 执行若干条指令,向 DMAC 写入:

  • 主存起始地址 → AR
  • 传输字数 → WC
  • 传输方向(读/写)
  • 启动 DMA 传输

数据传输阶段

DMAC 接管总线控制权,在设备和主存之间逐字传输数据。每传一个字:

  1. 设备将数据送入 DR
  2. DMAC 将 AR 中的地址放到地址总线
  3. DR 中的数据通过数据总线写入主存
  4. ARAR+1WCWC1
  5. WC0,重复上述过程

后处理阶段

WC=0 时,DMAC 向 CPU 发出中断请求。CPU 响应中断,执行中断服务程序:

  • 校验传输是否正确
  • 决定是否继续下一批传输
  • 若需要,重新设置 DMAC 参数

DMA 与 CPU 的访存冲突

DMA 传输期间,DMAC 和 CPU 都可能需要访问主存,产生冲突。三种解决方式:

停止 CPU 访存

DMA 传输期间,CPU 完全让出总线,不访问主存。

  • 控制最简单
  • CPU 效率低(被完全阻塞)
  • 适合数据传输量大且连续的场景

周期窃取(Cycle Stealing)

DMA 每需要传输一个字时,窃取一个存储周期,占用总线一个周期,然后归还。

CPU 周期 DMA 窃取 CPU 周期 DMA 窃取 
  • CPU 和 DMA 交替使用总线
  • CPU 只被延迟一个存储周期(而非整个传输过程)
  • 这是最常用的方式

当 CPU 和 DMA 同时请求访存时,DMA 优先。原因:DMA 对应的外设有实时性要求,数据如果不及时取走可能丢失(如磁盘旋转不等人),而 CPU 延迟一个周期影响不大。

交替访问

将一个存储周期分为两个时间片,一个给 CPU,一个给 DMA。

CPU 半周期 | DMA 半周期一个存储周期
  • CPU 和 DMA 不会冲突,不需要仲裁
  • 要求存储器速度足够快(一个存储周期内完成两次访问)
  • CPU 没有任何延迟
方式CPU 受影响程度控制复杂度存储器速度要求
停止 CPU大(完全阻塞)普通
周期窃取小(延迟一个周期)普通
交替访问高(需加倍)

DMA 与中断的区别

特性中断方式DMA 方式
数据传输经过 CPU
传输单位字/字节数据块
CPU 介入时机每次传输开始和结束
响应时机指令执行结束后存储周期结束后
优先级低于 DMA高于中断
中断请求的作用传输数据报告传输完成

关键区别:中断响应发生在一条指令执行完毕之后(指令边界),DMA 请求响应发生在一个存储周期结束后(更细粒度)。

交互可视化

加载可视化中...

例题

例 1:某 DMA 接口的 AR 为 20 位,WC 为 16 位。该 DMA 一次最多传输多少字节?能访问的最大主存空间是多少?

:WC 16 位,最多计数 216=64K 个字(如果按字节计数则 64 KB)。AR 20 位,最大寻址 220=1 MB

例 2:DMA 传输完成后,CPU 是如何得知的?

:DMA 控制器在 WC 减到 0 后,向 CPU 发出中断请求。CPU 在当前指令执行完毕后响应该中断,进入 DMA 的中断服务程序进行后处理。DMA 传输完成后的通知仍然依赖中断机制。

例 3:为什么 DMA 请求的优先级高于中断请求?

:DMA 对应的外设(如磁盘)有严格的实时要求——磁盘旋转到数据位置时如果不立刻读取,数据就会转过去,需要等一圈才能再读。而 CPU 被延迟一个存储周期的代价很小。因此 DMA 请求优先级必须高于一般中断请求。

例 4(DMA 效率计算):某计算机主频 500 MHz,CPI = 4,外设数据率 40 MB/s,I/O 数据端口 32 位。采用 DMA 方式,每次传送块大小 1000 B,DMA 预处理和后处理共需 500 个时钟周期。求 CPU 用于该外设 I/O 的时间占比。

DMA 每秒传输次数 =40MB/s÷1000B=40000 次/秒

DMA 方式下,只有预处理和后处理需要 CPU 参与(数据传输全程由 DMAC 硬件完成)。

CPU 每秒用于 I/O 的时钟周期 =40000×500=2×107

CPU 总时钟周期/秒 =500×106

CPU 用于 I/O 的时间占比=2×1075×108=4%

对比:若采用中断方式,每传输一个字节都需要 CPU 执行中断服务程序(假设每次中断需 500 个时钟周期),则 CPU 用于 I/O 的时间 =40×106×500/(500×106)=40000%——CPU 完全无法承受。这就是高速设备必须使用 DMA 的原因。

易混淆知识点

1. DMA 请求和中断请求是一回事吗?

不是。DMA 请求是 DMAC 向 CPU 申请总线控制权,CPU 在当前存储周期结束后响应(让出总线)。中断请求是设备请求 CPU 执行中断服务程序,CPU 在当前指令执行完毕后响应。DMA 的粒度更细(存储周期级),中断的粒度更粗(指令级)。

2. DMA 传输完成后靠什么通知 CPU?

中断。DMA 传输完成后,DMAC 向 CPU 发中断请求,CPU 响应后执行后处理程序。所以 DMA 方式并没有完全取代中断,而是将中断的使用从"每传一个字就中断一次"降低为"传完整块数据才中断一次"。

3. 周期窃取时,CPU 程序执行会变慢吗?

会,但影响很小。每次窃取一个存储周期,CPU 的访存操作被推迟了这一个周期。如果 DMAC 窃取很频繁(高速设备),CPU 的有效执行速度会下降,但远好于中断方式下 CPU 全程参与数据搬运。

考点清单

  • DMA 传输数据不经过 CPU,以数据块为单位
  • DMAC 四个核心寄存器:AR(地址)、WC(计数)、DR(数据缓冲)、CR(命令/状态)
  • DMA 传输三阶段:预处理(CPU 设参数)→ 数据传输(DMAC 控制)→ 后处理(中断通知 CPU)
  • 周期窃取是最常用的访存冲突解决方式,DMA 优先于 CPU
  • DMA 响应在存储周期结束后,中断响应在指令执行结束后
  • DMA 传输完成的通知仍然使用中断机制

真题练习

相关真题(3题)

2025Q21选择题2分

DMA方式适用的I/O设备类型

2018Q43综合题8分

中断I/O与DMA方式的CPU开销对比综合题

2009Q43综合题8分

中断方式与DMA方式的CPU开销对比综合题