深入理解计算机系统——CPU 是怎样工作的?

参考内容: 处理器是如何工作的 《编码:隐匿在计算机软硬件背后的语言》——[美] Charles Petzold

CPU 大家应该都不会陌生,日常用的手机、电脑中都有 CPU,CPU 作为一个设备的大脑,指挥着其它各种硬件的协同工作,芯片技术也是国内一直没有突破的技术。

我们先来看看怎么让电路去运算呢?比如如何让电路运算1 + 1,直接使用下面这个装置就可以了。

image.png

作为一个比较好奇的人,总会想看看那个方框框里面是什么样子的,让我们慢慢解开加法器的外衣。

image.png

这个电路你应该不会陌生,它需要两个开关都闭合时灯泡才会发光,也就是说它有两个输入,开关闭合时我们认为输入为 1,未闭合状态视为 0;而灯泡是否发光就是我们的输出,发光为 1,否则为 0。于是就有了下面这张表。

and 0 1
0 0 0
1 0 1

这样的电路我们就把它称之为与(and)门,它接受两个逻辑输入,并会给出我们一个逻辑输出,与它相似的电路还有逻辑或(or)异或(xor)等等,因为太多了,就不一一介绍了,如果感兴趣可以 Google 一下。

为了方便我们把上面的电路做一个简化,抽象成下面这个样子,其它的电路也可以通过 Google 找到它们的样子。

image.png

现在直接给出一个可以运算加法的电路,它的样子长下面这样。

image.png

我们也可以给它列一个表,显得更清晰,表中之所以有两位是因为加法有可能会产生进位,而我们使用的是二进制表示,所以10表示的是十进制中的2

+ 0 1
0 00 01
1 01 10

有加法就很好办了,减法实际上是加一个负数,除法可以改写成乘法,乘法又可以改写成加法,现在加法一统天下了。

好了,上面说了那么多,还贴了那么多图,只是为了让你相信电路是可以实现我们数学上的运算的,下面就没有那么声情并茂了。

我们可以把一个运算抽象为下面这个模型。

输入数据 --> 运算 --> 输出数据

计算机中把各种像上述加法器一样的运算器放在了同一个小盒子里面,组成成一个运算器集合,我们给它取个名字叫算术逻辑单元(ALU:Arithmetic Logical Unit),它是 CPU 的核心组成部分。

当然我们不可能只进行加法这种简单运算,一个很长很长的算式需要经过多步运算,小学我们就学过梯等式,它实际上有一大推输入,中间那么多梯子,都是临时步骤,临时步骤、数据一类的东西都需要有个东西给它存起来,所以在 CPU 就拿出一个小盒子当做存储器

# 梯等式
485 - ( 6 × 4 + 32 )
= 485 - ( 24 + 32 )
= 485 - 56
= 429

现在我们有了存储器和运算器两个干事的人,但是没有一个统筹兼顾的领导者,控制器就充当了这个角色,它需要把控制储存器中的数据发送到 ALU 去进行运算,然后再将运算的结果取出来存到储存器中。总的来说,控制器的工作就是完成协调和指挥整个计算机系统的操作。

我们把上面的结构画出来,图中的虚线表示指令流,实线表示数据流,这个结构就是著名的冯 · 诺依曼体系结构,遵循这种结构的计算机都叫做冯诺依曼机,现在所有的机器都是冯诺依曼机。

image.png

请注意,我们现在实际上只有硬件,没有软件是什么事情都干不了了,我们这里所说的软件是一堆指令序列,比如加法指令、传送指令等等组成的序列,也就是我们常说的汇编语言。

但是在早期并不是这样的,这台机器上编写的指令序列是无法运行在另一家公司生产的机器上的,即使是同一个公司的机器,如果不是同一代,那也不能运行,所以早期的编程是直接面向硬件的。

这时就有人站出来研究如何实现一次编写多处运行了,IBM 首次在它的 360 系统上引入了ISA的概念,即指令集体系结构。

指令集体系结构将编程所要了解的硬件信息从硬件系统中抽象了出来,这样开发人员就可以直接面向处理器的 ISA 进行编程了。

为什么手机上的软件不能运行在电脑中呢?就是因为个人电脑所使用的 Intel 和 AMD 处理器都是基于 x86 指令集的,而手机大多数都使用的是基于 ARM 指令集的处理器。

现在处理器被分为指令集体系结构、处理器微架构、处理器物理实现三个层次。体系结构相当于需求,微架构好比设计,物理实现则是具体的实现过程。

比如我们规定指令集中必须有加法指令,这个指令你怎么设计、如何实现是你给的事,我只管给出两个加数你能给我输出一个正确的结果,简单来说就是抽象封装。

image.png

操作系统编程基础