📄 一句话概括
程序不靠 CPU 亲手搬——DMA 控制器接管总线,把外部设备里的程序成批直送内存,CPU 只下一次命令。
📝 本节和前面几节的关系
硬件完工、内存空白,这一节解决【程序怎么进来】:先引 DMA 这条绿色通道。
一、没有 DMA 的笨办法
让 CPU 亲手搬:每搬一个字节都是【读一次源、写一次目的】两个动作,搬 10 个字节占 CPU 20 次动作。 更糟的是全程 CPU 被钉死在这件事上,别的什么都不能干——包工头亲自当搬运工。
二、DMA 怎么走绿色通道
DMA(Direct Memory Access,直接内存访问):一块 DMA 控制器向 CPU 申请总线使用权; CPU 把起始地址和字节数交代给 DMA 控制器,然后放手; DMA 控制器自己驱动总线,把外部设备的数据成批直送内存;搬完再通知 CPU 验收。 同样搬 10 个字节,CPU 只花 1 次动作下命令,搬运期间还能干别的活。
三、本课与 2026 的 DMA
本章用 DMA 把测试程序从外部设备装进内存——因为拨码开关一个字节一个字节敲太慢。 【⚠️ 2026 现状】如今硬盘、网卡、显卡的大宗传输全走 DMA,配合中断通知 CPU;NVMe SSD 的低延迟,一半功劳在 DMA 与多队列。
四、动手 Demo:有 DMA 与没 DMA 的搬运账
把两种搬法的 CPU 动作次数算成账,一看便知谁该当包工头。
# 搬运账:N 个字节的代价
N = 10
print("无 DMA: CPU 动作", 2 * N, "次, 全程被占")
print("有 DMA: CPU 动作 1 次, 搬运期间自由")
实跑输出:
--------------------------------------------------------------------
用 DMA 装程序——不过 CPU 的绿色通道
--------------------------------------------------------------------
把测试程序装进内存,如果全靠 CPU 一个字节一个字节搬,又慢又占工时。
DMA(直接内存访问) 让 I/O 设备绕过 CPU 直达内存:
[没有 DMA] 搬 10 个字节到内存:
CPU 重复 10 次:读 I/O 一个字节 -> 写内存一个字节
CPU 动作 = 20 次(10 读 + 10 写),全程被占用
[有 DMA] 搬 10 个字节到内存:
CPU 下一次命令(起始地址+字节数) -> DMA 控制器自己搬完
CPU 动作 = 1 次,搬的时候 CPU 还能干别的
方式 CPU 动作次数 CPU 期间能否干别的
-------------------------------------------------
无 DMA 2N(N=字节数) 不能——全程亲搬
有 DMA 1 能——只管下命令和验收
现代计算机里硬盘、网卡的大宗传输全走 DMA——CPU 只当包工头,不当搬运工。
账里没算 DMA 控制器本身的开销——它存在就是为了让 CPU 从搬运工里解脱。 教材里 DMA 装的是测试程序;现代电脑开机时,固件把操作系统装进内存走的是同一思想的豪华版。
30 秒实验
- 把包工头类比讲给别人听:老板下一句命令(搬哪、搬多少),搬运全程不插手。
- 查一查本机设备管理器里的【直接内存访问控制器】——DMA 不是概念,是真芯片。
常见误区
- 以为 DMA 是软件技术——它是总线上的硬件机制,有专门的控制器芯片。
- 以为 DMA 会绕过内存——DMA 恰恰是直达内存,绕过的是 CPU 的手。
自测三问(点开对答案)
1. DMA 的全称与作用是什么? —— Direct Memory Access——设备不经 CPU 直达内存的成批传输机制。 2. 没有 DMA 时搬 N 个字节 CPU 要几个动作? —— 2N 个(N 次读源+N 次写目的),且全程被占用。 3. 本章为什么用 DMA 装程序? —— 拨码开关逐字节敲太慢,成批直送内存又快又解放 CPU。- ☐ 下一节(2.9 连接用于输入输出的外部设备)
相关笔记
- 23 课 6.2.1 网卡将接收到的信号转换成数字信息 — 网卡收包正是 DMA 的日常
- 对计算机来说什么都是数字 — 总线上跑的全是数字
- 💻 计算机是怎样跑起来的 · 索引