💻 第二章 试着制造一台计算机吧
📄 一句话概括

程序不靠 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 秒实验

  1. 把包工头类比讲给别人听:老板下一句命令(搬哪、搬多少),搬运全程不插手。
  2. 查一查本机设备管理器里的【直接内存访问控制器】——DMA 不是概念,是真芯片。

常见误区

  1. 以为 DMA 是软件技术——它是总线上的硬件机制,有专门的控制器芯片。
  2. 以为 DMA 会绕过内存——DMA 恰恰是直达内存,绕过的是 CPU 的手。
自测三问(点开对答案) 1. DMA 的全称与作用是什么? —— Direct Memory Access——设备不经 CPU 直达内存的成批传输机制。 2. 没有 DMA 时搬 N 个字节 CPU 要几个动作? —— 2N 个(N 次读源+N 次写目的),且全程被占用。 3. 本章为什么用 DMA 装程序? —— 拨码开关逐字节敲太慢,成批直送内存又快又解放 CPU。

相关笔记