CPU 概念
- 程序:由一条条指令组成。程序存储在内存中。
- 指令:指示计算机要做什么。
- 如下图所示是一张指令表,假设 8 位指令,前 4 位代表操作码,指向相应的指令;后 4 位代表数据来自哪里,可以是寄存器或内存地址。
- CPU的功能:中央处理单元,与RAM配合,负责执行程序。
- 数学指令(eg. 加/减):CPU 让 ALU 进行数学运算
- 内存指令:CPU 和内存进行通信,然后读/写值
- 微体系架构:把重点放在功能,而不是一根根线具体怎么连,当我们用一条线连接两个组件时,这条线只是所有必须线路的一个抽象,这种高层次视角叫 “微体系架构“。
CPU的组成
- 寄存器:用来 临时存数据 和 操作数据
- 通用寄存器:存储任意数据
- 指令地址寄存器/指令计数器:存放当前指令的内存地址(追踪程序运行到哪里了)。能自动形成下一条指令的地址(+1)
- 指令寄存器:存储指令
- … …
- 运算器 ALU:负责算数和逻辑运算
- 控制器/控制单元:控制整个 CPU 的工作,保证 程序的正确执行 以及 能够处理异常事件。
- eg. 指令解码由控制单元的逻辑电路完成。
- 包含 指令地址寄存器 和 指令寄存器 等。
- 时钟:负责管理CPU的节奏
- 时钟以精确的间隔触发电信号,控制单元会用这个信号,推进 CPU 的内部操作,确保一切按步骤进行。
- CPU “取指令→解码→执行” 中每一步的时间为一个周期,每一步的速度叫 “时钟速度“,单位是赫兹,代表 多少个周期每秒。
- eg. 6 分钟 4 条指令,每条指令包含取指令、解码、执行这 3 个周期,则时钟速度为 4 × 3 / 360 = 0.033 赫兹
- 超频:加快时钟速度,提升性能
- 降频:减慢时钟速度,省电
- 动态调整频率:很多现代处理器可以按需求 加快或减慢时钟速度
将以上组件提升一层新的抽象,变成一个独立的 CPU 组件,如下图所示。
RAM 是在 CPU 外面的独立组件,CPU 和 RAM 之间用 “地址线” “数据线” 和 “允许读/写线” 进行通信。
CPU 执行指令的流程
取指令阶段 FETCH PHASE
取指令阶段负责拿到指令。
- 首先,指令地址寄存器连接到 RAM
- 若当前指令地址寄存器中存储的指令地址为address,则RAM返回address对应的值(指令),并复制到指令寄存器
- 如下图所示,初始时,各个寄存器初始值都为0,因此RAM返回地址0对应的值。
解码阶段 DECODE PHASE
- 将指令寄存器中的指令参照指令表
- 这里的例子,指令前四位代表操作码,后四位代表数据来源(内存或寄存器地址)
- 指令解码由控制器进行。可通过简单的逻辑门电路对指令进行解码,如下图所示。不同的指令由不同的逻辑电路解码。
执行阶段 EXECUTE PHASE
以指令 0010 1110 为例,该指令操作码是0010,解码为 LOAD_A 指令:
- 用”检查是否 LOAD_A 指令的电路”,可以打开 RAM 的 “允许读取线”
- 把地址 14(1110) 传给 RAM
- 用 “检查是否 LOAD_A 指令的电路” 启用寄存器 A 的 “允许写入线”
- 把 RAM 地址 14 的值存储到寄存器A中
- 指令执行结束,指令地址寄存器中的地址 +1
以指令 1000 0100 为例,该指令操作码是1000,解码为 ADD 指令;第一个地址是 01, 代表寄存器B,第二个地址是 00, 代表寄存器A。该指令代表把寄存器 B 的值,加到寄存器 A 里:
- 启用寄存器 B(寄存器地址01),作为 ALU 的第一个输入
- 启用寄存器 A(寄存器地址00),作为 ALU 的第二个输入
- 传递 ADD 操作码给 ALU,使 ALU 明确其要进行的是加法操作
- 控制单元用一个自己的寄存器暂时保存结果 0001 0001(3+4=17)
- 关闭 ALU,然后把值写入正确的寄存器 A 。(先保存到控制单元的临时寄存器,关闭ALU后再写入寄存器A,否则会不断和自己相加)
- 指令地址 + 1
以指令 0100 1101 为例,该指令操作码是0100,解码为 STORE_A 指令:
- 打开 RAM 的允许写入线
- 把地址 13(1101) 传给 RAM
- 打开寄存器 A 的 “允许读取线”
- 把寄存器 A 里的值,传给 RAM,保存到 RAM 地址 13
- 指令地址 + 1