第一次呼吸
复习
- 计算机总线:总线让 CPU、存储器与外设共享一组通信线路
- 输入输出系统:I/O 接口连接外设,支持查询、中断和 DMA
- 中断系统:外设可主动通知 CPU,CPU 保存现场后处理再恢复
TL;DR
- 一段程序进入存储器后,机器可以沿时钟自行运行
- 每一个大部件都来自前面造过的小部件
- 从逻辑门到整机的主线在这里闭合
正文
零件时代结束了。运算器、存储器、控制器、总线和外设都已经就位。现在,我们只做一件事:让它们第一次一起工作。
放进第一段程序
地址 20 保存 3,地址 21 保存 5。我们再约定:地址 240 不属于普通存储器,而是四盏 LED 的 I/O 接口,向它写入就等于改变灯的亮灭。
程序要把两个数相加,把结果写到地址 22,再送到 LED:
| 地址 | 内容 |
|---|---|
| 0 | LOAD A, [20] |
| 1 | LOAD B, [21] |
| 2 | ADD R, A, B |
| 3 | STORE [22], R |
| 4 | STORE [240], R |
| 20 | 数据 3 |
| 21 | 数据 5 |
| 22 | 数据 0 |
把 PC 清成 0,打开时钟。
看它自己走
控制器按 PC 从地址 0 取指,译出 LOAD,再从地址 20 取回 3,写入 A。随后 PC 指向 1,同样把 5 写入 B。
取到地址 2 的 ADD 后,控制器让 A、B 进入 ALU,并在结果稳定后把 8 写入 R。地址 3 的 STORE 又把 8 写进存储器 22。
最后一条 STORE 把地址 240 放上总线。地址译码电路发现它属于 I/O 接口,于是 R 中的低 4 位没有写进普通存储器,而是送到了四盏灯。灯显示:
1000
这是二进制的 8。四盏灯里只有最左边那盏亮着。
整个过程,没有人重接线路,没有人抄写中间结果。人只提供了程序与最初的数据,机器便沿着时钟,一步一步把它走完了。这台机器,自己呼吸了第一口。
每块积木都能找到来处
逻辑门 → 加法器 → ALU → 运算器
反馈 → 锁存器 → 触发器 → 寄存器 → 存储器
指令 → PC → 控制器 → CPU
总线 → I/O → 中断
计算机不是突然出现的黑盒。每当旧机器遇到一个做不到的动作,我们就加上一小块;三十多章以后,这些小块终于彼此咬合。
它现在只会做很少的事,却已经具备了通用计算机最关键的样子:程序和数据都存放在存储器里,CPU 可以读取指令,并因此改变自己接下来的行为。机器第一次拥有了“按自己的安排做事”的能力。
再往后,问题不再只是“机器由什么组成”,而是“人怎样更轻松地让它做事”。汇编语言、编译器和操作系统,会从这里接过下一段路。
思考题 1
程序与数据都只是存储器中的比特。CPU 为什么不会把地址 20 的数字 3 当成指令执行?在什么情况下它又可能真的这样做?
思考题 2
回头看看这条从逻辑门到整机的主线。如果让你只保留一句话来概括“计算机是怎样造出来的”,你会怎么说?
小结
知识点
- 一段程序从取指到输出的完整路线
- 运算、存储、控制与输入输出的协作
- 存储程序是通用计算机的关键
参考资料
- Wikipedia(zh):冯·诺伊曼结构:存储程序式计算机的经典框架
- Wikipedia(zh):通用图灵机:程序即数据这一思想的理论源头
思考题答案(仅供参考)
思考题 1
正常情况下,PC 只指向程序所在的地址,地址 20 只会被 LOAD 当作数据读取。但如果跳转地址写错、PC 被破坏,或程序故意跳到数据区,CPU 仍会尝试把那里的比特当指令译码——因为比特本身并不标注“我是数据”。是使用方式,而不是比特本身,决定了它的身份。
思考题 2
参考答案:每当遇到一个做不到的动作,就造一个能完成它的新部件,再把它接到已有的机器上。 逻辑门拼出加法器,加法器拼出 ALU,反馈拼出存储器,指令与控制器拼出 CPU。计算机不是一步造出来的,而是这样一层层积累、一点点咬合而成的。
协议
本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。
封面图
设计师 | 南国微雪