Appearance
题目
下列关于 DMA 方式的叙述中,正确的是( )。
I. DMA 传送前由设备驱动程序设置传送参数
II. 数据传送前由 DMA 控制器请求总线使用权
III. 数据传送由 DMA 控制器直接控制总线完成
IV. DMA 传送结束后的处理由中断服务程序完成
错因
A
漏选 III 和 IV——可能误以为"DMA 传送过程不需 CPU 参与,所以也不存在 ISR 后处理",但 DMA 结束后必须由 CPU 跑 ISR 做后处理(关闭设备、唤醒等待进程、发完成信号),ISR 是必经环节。III 是 DMA 的核心定义(控制器直接控总线传数据),漏掉等于不知道 DMA 是什么。
B
漏选 II——可能想成"DMA 传送前 CPU 已经把总线让给 DMA 了,不需要再请求"。但实际上每次 DMA 启动 / 周期挪用 / 块结束时都需要 DMA 控制器主动向总线仲裁器申请使用权(CPU 不会无条件让出总线),II 是 DMA 工作流程的标准动作。
C
漏选 I——可能想成"DMA 自己干活,跟驱动程序无关"。但 DMA 控制器需要的源地址、目的地址、传送字节数、方向等参数都由设备驱动程序在传送前装入 DMA 控制器的寄存器——这是 CPU 在 DMA 预处理阶段必须做的工作。没有 I 这步,DMA 控制器根本不知道要搬什么。
总解析
DMA 工作的三阶段(教科书标配,背下来基本不丢分):
| 阶段 | 谁主导 | 做什么 | 对应题项 |
|---|---|---|---|
| 预处理 | CPU(执行设备驱动程序) | 检测设备状态、设置 DMA 控制器参数(源/目的地址、字节数、方向)、启动设备 | I ✓ |
| 数据传送 | DMA 控制器 | 申请总线使用权 + 直接控制总线在设备↔主存之间搬数据 | II + III ✓ |
| 后处理 | CPU(执行中断服务程序) | DMA 结束发中断,CPU 跑 ISR 做收尾(关设备、唤醒进程、检验数据) | IV ✓ |
逐项审计:
| 项 | 说法 | 对应阶段 | 对/错 |
|---|---|---|---|
| I | 传送前由设备驱动程序设置参数 | 预处理 | ✓ |
| II | 传送前 DMA 控制器请求总线使用权 | 数据传送阶段开头 | ✓ |
| III | DMA 控制器直接控制总线完成传送 | 数据传送阶段主体 | ✓ |
| IV | 传送结束后处理由 ISR 完成 | 后处理 | ✓ |
四项全对——这是 408 真题里少见的"全选"题("总分总"式 DMA 流程考察)。
最终答案是 D(I、II、III、IV)。
DMA 完整时序图(用于强化记忆):
CPU 调驱动程序
│
├─[I] 写 DMA 控制器:源地址 / 目的地址 / 字节数 / 方向 / 启动位
│
├─ 设置完毕,CPU 继续跑用户程序(解放!)
│
DMA 控制器:
│
├─[II] 设备准备好数据 → DMA 向总线仲裁器请求总线
│
├─[III] 拿到总线 → 直接在设备↔主存之间搬数据(不经 CPU)
│
├─ 重复 II/III 直到字节数耗尽
│
├─ 块传送结束 → DMA 向 CPU 发中断
│
CPU 响应中断:
│
└─[IV] ISR 做后处理(关设备、唤醒进程、释放 DMA 通道)为什么 DMA 既要驱动程序又要 ISR:
- 驱动程序在预处理阶段把"我要传什么"告诉 DMA(DMA 不是读心术)
- ISR 在后处理阶段把"传完了"告诉操作系统 / 用户进程(DMA 结束后没人通知就等于丢了消息)
- DMA 只负责"搬运",不负责"协议层"——前后的协议工作仍由 CPU 软件做