Appearance
DMA直接存储器访问
考情分析
DMA 是 408 大题的高频考点,常与中断结合出综合题。DMA 控制器的组成、传输流程、以及 DMA 与 CPU 争用主存的三种解决方式是核心考查内容。
DMA 的基本思想
中断驱动方式中,每传送一个字/字节都要经过 CPU:设备 → CPU 寄存器 → 内存,效率受限。
DMA(Direct Memory Access)的核心思想是:数据传输不经过 CPU,由 DMA 控制器(DMAC)直接控制总线,在设备和主存之间搬运数据。
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 接管总线控制权,在设备和主存之间逐字传输数据。每传一个字:
- 设备将数据送入 DR
- DMAC 将 AR 中的地址放到地址总线
- DR 中的数据通过数据总线写入主存
, - 若
,重复上述过程
后处理阶段
- 校验传输是否正确
- 决定是否继续下一批传输
- 若需要,重新设置 DMAC 参数
DMA 与 CPU 的访存冲突
DMA 传输期间,DMAC 和 CPU 都可能需要访问主存,产生冲突。三种解决方式:
停止 CPU 访存
DMA 传输期间,CPU 完全让出总线,不访问主存。
- 控制最简单
- CPU 效率低(被完全阻塞)
- 适合数据传输量大且连续的场景
周期窃取(Cycle Stealing)
DMA 每需要传输一个字时,窃取一个存储周期,占用总线一个周期,然后归还。
- CPU 和 DMA 交替使用总线
- CPU 只被延迟一个存储周期(而非整个传输过程)
- 这是最常用的方式
当 CPU 和 DMA 同时请求访存时,DMA 优先。原因:DMA 对应的外设有实时性要求,数据如果不及时取走可能丢失(如磁盘旋转不等人),而 CPU 延迟一个周期影响不大。
交替访问
将一个存储周期分为两个时间片,一个给 CPU,一个给 DMA。
- CPU 和 DMA 不会冲突,不需要仲裁
- 要求存储器速度足够快(一个存储周期内完成两次访问)
- CPU 没有任何延迟
| 方式 | CPU 受影响程度 | 控制复杂度 | 存储器速度要求 |
|---|---|---|---|
| 停止 CPU | 大(完全阻塞) | 低 | 普通 |
| 周期窃取 | 小(延迟一个周期) | 中 | 普通 |
| 交替访问 | 无 | 高 | 高(需加倍) |
DMA 与中断的区别
| 特性 | 中断方式 | DMA 方式 |
|---|---|---|
| 数据传输经过 CPU | 是 | 否 |
| 传输单位 | 字/字节 | 数据块 |
| CPU 介入时机 | 每次传输 | 开始和结束 |
| 响应时机 | 指令执行结束后 | 存储周期结束后 |
| 优先级 | 低于 DMA | 高于中断 |
| 中断请求的作用 | 传输数据 | 报告传输完成 |
关键区别:中断响应发生在一条指令执行完毕之后(指令边界),DMA 请求响应发生在一个存储周期结束后(更细粒度)。
交互可视化
例题
例 1:某 DMA 接口的 AR 为 20 位,WC 为 16 位。该 DMA 一次最多传输多少字节?能访问的最大主存空间是多少?
解:WC 16 位,最多计数
例 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 每秒传输次数
DMA 方式下,只有预处理和后处理需要 CPU 参与(数据传输全程由 DMAC 硬件完成)。
CPU 每秒用于 I/O 的时钟周期
CPU 总时钟周期/秒
对比:若采用中断方式,每传输一个字节都需要 CPU 执行中断服务程序(假设每次中断需 500 个时钟周期),则 CPU 用于 I/O 的时间
易混淆知识点
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 传输完成的通知仍然使用中断机制