今天我们讲 处理器,提示下 - 这集可能是最难的一节, 所以一旦你理解了,就会变得超厉害。
我们已经做了一个算术逻辑单元(ALU)输入二进制,它会执行计算。我们还做了两种内存: 寄存器 - 很小的一块内存,能存一个值 ,之后我们增大做出了 ,RAM 是一大块内存,能在不同地址存大量数字,现在是时候把这些放在一起,组建计算机的 "心脏" 了。但这个 "心脏" 不会有任何包袱,比如人类情感.。计算机的心脏是"中央处理单元",简称 "CPU" 。CPU 负责执行程序,比如 Office,Safari 浏览器。程序由一个个操作组成 ,这些操作叫"指令"(Instruction) ,因为它们"指示"计算机要做什么,如果是数学指令,比如加/减 ,CPU 会让 ALU 进行数***算,也可能是内存指令,CPU 会和内存通信,然后读/写值,也可能是内存指令,CPU 会和内存通信,然后读/写值,CPU 里有很多组件。
所以我们一边说一边建 我们把重点放在功能,而不是一根根线具体怎么连,当我们用一条线连接两个组件时,这条线只是所有必须线路的一个抽象。这种高层次视角叫 "微体系架构" 。我们首先要一些内存,把上集做的 RAM 拿来就行。为了保持简单,假设它只有 16 个位置,每个位置存 8 位 ,再来四个 8 位寄存器,叫 A,B,C,D 寄存器用来 临时存数据 和 操作数据 ,我们已经知道数据 是以二进制值存在内存里 。程序也可以存在内存里 ,我们可以给 CPU 支持的所有指令,分配一个 ID 指令表 指令 描述 4位操作码 地址或寄存器 。在这个假设的例子,我们用前四位存 "操作代码" 简称 "操作码" (opcode) ,后四位代表数据来自哪里,可以是寄存器或内存地址。我们还需要两个寄存器,来完成 CPU。
-
一个寄存器追踪程序运行到哪里了,我们叫它 "指令地址寄存器" 。顾名思义,存当前指令的内存地址 。
-
另一个寄存器存当前指令,叫 "指令寄存器" 当启动计算机时,所有寄存器从 0 开始。
取指令阶段
为了举例,我们在 RAM 里放了一个程序,我们今天会过一遍 CPU 的第一个阶段叫 "取指令阶段" ,负责拿到指令,首先,将 "指令地址寄存器" 连到寄存器的值为 0,因此 RAM 返回地址 0 的值 0010 1110 会复制到 "指令寄存器" 里。
解码阶段
现在指令拿到了,要弄清是什么指令,才能执行(execute) 要弄清是什么指令,才能执行(execute)而不是杀死(kill)它 。这是 "解码阶段" 指令表 指令 描述 4位操作码 地址或寄存器,前 4 位 0010 是 LOAD A 指令 。意思是,把 RAM 的值放入寄存器,后 4 位 1110 是 RAM 的地址, 转成十进制是 。接下来,指令由 "控制单元" 进行解码,就像之前的所有东西 "控制单元" 也是逻辑门组成的,比如,为了识别 "LOAD A" 指令,我们需要一个电路,检查操作码是不是。我们可以用很少的逻辑门来实现。
执行阶段
现在知道了是什么指令就可以开始执行了,开始 "执行阶段",用 "检查是否 LOAD_A 指令的电路" 可以打开 RAM 的 "允许读取线", 把地址 14 传过去 ,RAM 拿到值,0000 0011,十进制的 3。因为是 LOAD_A 指令,我们想把这个值只放到寄存器 A,其他寄存器不受影响。所以需要一根线,把 RAM 连到 4 个寄存器用 "检查是否 LOAD_A 指令的电路" 。启用寄存器 A 的 "允许写入线",这就成功把 RAM 地址 14 的值,放到了寄存器。既然指令完成了,我们可以关掉所有线路,去拿下一条指令,我们把 "指令地址寄存器"+1,"执行阶段"就此结束。
LOAD_A 只是 CPU 可以执行的各种指令之一,不同指令由不同逻辑电路解码,这些逻辑电路会配置 CPU 内的组件来执行对应操作,具体分析这些解码电路太繁琐了。既然已经看了 1 个例子, 干脆把 "控制单元 "包成一个整体,简洁一些。没错,一层新抽象,控制单元就像管弦乐队的指挥 ,"取指令→解码→执行" 完成后,现在可以再来一次。
下一节我们将用这三个阶段的知识,来完成讲下cpu怎么去工作的。
相关阅读: