精简版 · 小杯2026-08 冻结,已停止更新(发布前修订了 4 处已知错误)。后续勘误与新增内容只在正式版。看正式版(中杯)→
Skip to content

DMA直接存储器访问

考情分析

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

大纲定位

考纲第六章(三)「I/O 方式」第 3 条:DMA 方式(DMA 控制器的组成,DMA 传送过程)。

要求到什么程度:说清 DMAC 四个核心寄存器、三阶段流程、与 CPU 争用主存的三种方式,并能算总线请求次数和 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 发中断)和控制逻辑(向总线仲裁器发总线请求、接管总线等)。

编者注("字"指多宽?):表里说的"每传一个字",这个字的宽度就是 DR(数据缓冲寄存器)的宽度,由题目给出(常见 8/16/32/64 位)。后面算总线请求次数、算 AR 递增量都要用它,不要默认按 1 字节。AR 每次的增量 = DR 的字节数。

三方都挂在系统总线上——这张图的关键是看清数据走的是哪条路:

   ┌─────────┐                                  ┌─────────┐
   │   CPU   │                                  │  主存    │
   └────┬────┘                                  └────┬────┘
        │                                            │
   ═════╪══════════════ 系统总线 ═══════════════════╪═════
        │                     │                      │
        │  ①设参数/③完成中断   │ ②数据直接在这两者之间走 │
        │                ┌────┴─────┐                │
        └───────────────→│ DMA 控制器 │←──────────────┘
                         │ AR WC DR CR│
                         └────┬─────┘
                              │  设备数据
                         ┌────┴─────┐
                         │   外设    │
                         └──────────┘

数据通路的两端是"设备接口 ↔ 主存",CPU 不在这条路上。DMAC 里的 DR 只是过渡缓冲,不改变通路的两端——这是选择题的一个落点。CPU 只在 ①(预处理设参数)和 ③(后处理响应完成中断)出现。

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 请求响应发生在一个存储周期结束后(更细粒度)。

三种方式其实是配合使用的

选择题常把三种 I/O 方式当成互斥的三选一,但实际的一次磁盘传送里它们是分工协作的:

图 8.24 DMA 方式进行磁盘数据传送过程

图 8.24 DMA 方式进行磁盘数据传送过程

阶段用哪种方式为什么
传送参数设置(初始化)查询CPU 主动写 DMAC 寄存器,同步完成,不值得中断
寻道、查找扇区中断机械动作耗时长(ms 级),CPU 不能干等
连续读写数据DMA数据率高、成批传送,逐字中断扛不住
结束、校验中断一次性事件,通知 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 预处理和后处理共需 125 条指令。求 CPU 用于该外设 I/O 的时间占比;并与中断方式对比。

Step 1. 把指令条数折成时钟周期。题目给的是指令条数,公式要的是周期数:

每次 DMA 的 CPU 开销=125 ×CPI 4=500 时钟周期

Step 2. 算 DMA 每秒被触发多少次。DMA 以为单位:

NDMA=40×106 B/s1000 B/块=40000 次/秒

Step 3. 占比。DMA 只有预处理和后处理要 CPU 参与,数据传输阶段全由 DMAC 完成:

40000×500500×106=2×1075×108=4%

Step 4. 对比中断方式。这里有个关键区别:中断方式是每传一个"传输单位"就中断一次,而传输单位由 I/O 数据端口位宽决定——本题端口 32 位,所以每次传 4 B,不是 1 B:

N中断=40×106 B/s4 B/次=107 次/秒107×500500×106=5×1095×108=10=1000%

占比超过 100%,意味着CPU 全部时间都用来伺候这一个设备也来不及。这就是高速设备必须用 DMA 的原因。

编者注(两个失分点)

  1. 传输单位不是"1 字节"。真题会通过"I/O 数据端口 32 位""每次传送一个字"这类条件把单位告诉你,N=R÷u 里的 u 必须用题给的那个值。默认按字节算是最常见的错法。
  2. 指令条数要乘 CPI 才是周期数。题目给"服务程序 18 条指令 + 其他开销 2 条指令、CPI = 5"时,每次开销是 (18+2)×5=100 个周期——两部分先相加再乘

另一类计算:总线请求次数

DMA 控制器里的数据缓冲寄存器(DR)每装满一次,就向 CPU 发一次总线请求。所以:

N总线请求=块大小(位)DR 位宽=块大小(B)×8DR 位宽

:磁盘一个扇区 512 B,DMA 控制器的数据缓冲寄存器 64 位,问读一个扇区期间 DMA 向 CPU 发了多少次总线请求?

N=512×864=409664=64 

编者注(易错):先把两边统一到位(bit)再除。512 B 和 64 bit 直接相除会得到 8,差 8 倍。若 DR 是 32 位(4 B),则 512÷4=128 次。

易混淆知识点

0. "DMA 全程不需要 CPU"对吗?

不对,这是常见的判断题陷阱。DMA 的三个阶段中只有数据传输阶段完全由 DMAC 硬件完成、不需要 CPU 执行指令:

  • 预处理(初始化):CPU 执行指令设置 DMAC 的地址寄存器、字计数器、传送方向——需要 CPU
  • 数据传输:DMAC 控制总线逐字传送——不需要 CPU
  • 后处理:传送完毕 DMAC 发中断,CPU 执行中断服务程序校验、善后——需要 CPU

所以正确表述是"DMA 传输过程不需要 CPU 干预",而不是"DMA 方式不需要 CPU"。

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 版)》§8.5 DMA 方式:图 8.24(p301)

真题练习