Keyboard shortcuts

Press ← or → to navigate between chapters

Press ? to show this help

Press Esc to hide this help

第一次呼吸

复习

  • 计算机总线:总线让 CPU、存储器与外设共享一组通信线路
  • 输入输出系统:I/O 接口连接外设,支持查询、中断和 DMA
  • 中断系统:外设可主动通知 CPU,CPU 保存现场后处理再恢复

TL;DR

  • 一段程序进入存储器后,机器可以沿时钟自行运行
  • 每一个大部件都来自前面造过的小部件
  • 从逻辑门到整机的主线在这里闭合

正文

  零件时代结束了。运算器、存储器、控制器、总线和外设都已经就位。现在,我们只做一件事:让它们第一次一起工作。

放进第一段程序

  地址 20 保存 3,地址 21 保存 5。我们再约定:地址 240 不属于普通存储器,而是四盏 LED 的 I/O 接口,向它写入就等于改变灯的亮灭。

  程序要把两个数相加,把结果写到地址 22,再送到 LED:

地址内容
0LOAD A, [20]
1LOAD B, [21]
2ADD R, A, B
3STORE [22], R
4STORE [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

  回头看看这条从逻辑门到整机的主线。如果让你只保留一句话来概括“计算机是怎样造出来的”,你会怎么说?

小结

知识点

  • 一段程序从取指到输出的完整路线
  • 运算、存储、控制与输入输出的协作
  • 存储程序是通用计算机的关键

参考资料

  1. Wikipedia(zh):冯·诺伊曼结构:存储程序式计算机的经典框架
  2. Wikipedia(zh):通用图灵机:程序即数据这一思想的理论源头

思考题答案(仅供参考)

思考题 1

  正常情况下,PC 只指向程序所在的地址,地址 20 只会被 LOAD 当作数据读取。但如果跳转地址写错、PC 被破坏,或程序故意跳到数据区,CPU 仍会尝试把那里的比特当指令译码——因为比特本身并不标注“我是数据”。是使用方式,而不是比特本身,决定了它的身份。

思考题 2

  参考答案:每当遇到一个做不到的动作,就造一个能完成它的新部件,再把它接到已有的机器上。 逻辑门拼出加法器,加法器拼出 ALU,反馈拼出存储器,指令与控制器拼出 CPU。计算机不是一步造出来的,而是这样一层层积累、一点点咬合而成的。

协议

  本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。

封面图

设计师 | 南国微雪