Appearance
题目
若设备采用周期挪用 DMA 方式进行输入输出,每次 DMA 传送的数据块大小为 512 字节,相应的 I/O 接口中有一个 32 位数据缓冲寄存器,对于数据输入过程,下列叙述中错误的是( )。
错因
A
A 是正确叙述。32 位(4 字节)的数据缓冲寄存器一满,就要立刻搬到主存——否则下一个 32 位到来会冲掉它。所以每凑够 32 位就向总线发一次 DMA 请求是周期挪用的标准节奏。512 字节的块需要 512/4 = 128 次这样的总线请求。
B
B 也正确。当 CPU 和 DMA 同时争用总线时,仲裁逻辑给 DMA 优先级更高——理由是 DMA 服务的设备数据是"等不起"的(设备缓冲快满 / 接收时间窗口紧迫,丢了就丢了),CPU 让一个总线周期对程序流影响微乎其微。这是周期挪用 DMA 的核心机制。
D
D 也正确。一个数据块(512 字节)传完后,DMA 控制器主动向 CPU 发中断请求,触发"DMA 传送结束"中断。CPU 跑 ISR 做后处理(关设备 / 唤醒进程)。这是 DMA 三阶段里"后处理"阶段的入口。
总解析
核心概念:周期挪用 vs 停止 CPU
DMA 占用总线有两种粒度:
| 方式 | 占用粒度 | CPU 对主存的访问 | 适用场景 |
|---|---|---|---|
| 周期挪用 | 每次 1 个总线周期 | DMA 占周期时 CPU 等 1 周期,其余时间正常用 | I/O 速率适中(磁盘、网卡) |
| 停止 CPU | 整块(直到块结束) | 整块期间 CPU 完全无法访问主存 | I/O 速率极高(视频流) |
| 交替访问 | 把 1 个总线周期切成 CPU 半 + DMA 半 | 主频高时可用 | 历史方式,现代少见 |
C 错在哪——C 描述的是"停止 CPU"方式,不是题面规定的"周期挪用"。题面已经明确说"采用周期挪用",那么:
- DMA 在每次搬一个 32 位字时占用 1 个总线周期
- 这 1 个周期内 CPU 暂停(不能访问主存)
- 其余时间 CPU 可以正常访问主存
- 整个 512 字节块传送过程中,DMA 只占用了 128 个零散的总线周期,剩下大量周期 CPU 都能用
所以"整个数据块传送过程中 CPU 不可以访问主存"是错的——CPU 在 DMA 没占总线的间隙里完全可以访问。
逐项判定:
| 选项 | 说法 | 是否符合周期挪用 |
|---|---|---|
| A 32 位凑够发一次请求 | 4 字节缓冲满立即送主存 | ✓ |
| B DMA 优先级 > CPU | 总线仲裁的标准约定 | ✓ |
| C 整块传送中 CPU 不能访存 | 把"周期挪用"误说成"停止 CPU" | ✗ |
| D 块结束发中断 | DMA 后处理的入口 | ✓ |
周期挪用的"挪用"二字精髓:DMA 是"借用"CPU 的一两个总线周期,借完即还,不是"霸占"整段时间。CPU 程序流程几乎不受影响(只是个别周期被推迟),用户感知不到。
最终答案是 C(这是错误叙述)。
周期挪用的开销估算(拓展,非本题考点):
512 字节块需 128 次总线周期。设总线周期 100 ns,则总占用时间 12.8 μs。如果 CPU 不参与,这点损失对几 GHz 的现代 CPU 几乎不可察觉——这正是周期挪用作为现代主流 DMA 模式的原因。