《寄存器是如何工作的?CPU真正计算的地方》
副标题:
|
1 2 |
从RAM到ALU,揭开CPU内部最快存储器的秘密 |
第1章 CPU缺失的一块拼图
在前面的课程中,我们已经了解了计算机是如何工作的。
我们学习了晶体管。
学习了逻辑门。
学习了内存如何存储数据。
也学习了CPU如何执行指令。
但是还有一个非常重要的问题没有回答。
CPU到底是在什么地方进行计算的?
当CPU执行加法时。
这些数字存放在哪里?
当一个程序每秒执行数十亿条指令时。
CPU又把正在处理的数据放在哪里?
很多人会认为答案是RAM。
毕竟RAM保存程序。
保存变量。
保存操作系统。
保存应用程序。
但实际上。
真正参与计算的,是一种更小、更快的存储结构。
它的名字叫:
寄存器。
寄存器就是CPU的私人工作区。
也是CPU真正工作的地方。
第2章 什么是寄存器
寄存器是位于CPU内部的一小块存储空间。
与RAM不同。
而寄存器直接建造在CPU核心内部。
你可以把寄存器理解为一个小盒子。
里面存放二进制数据。
例如:
数字。
地址。
函数参数。
指令位置。
计算结果。
这些数据本质上都是0和1。
例如:
|
1 2 |
0000000000000101 |
可能表示数字5。
而:
|
1 2 |
0000000000000011 |
可能表示数字3。
CPU随后就可以利用这些数据进行计算。
寄存器虽然很小。
但却是整个处理器最重要的组件之一。
第3章 为什么CPU不能直接使用RAM
这是很多初学者都会问的问题。
既然RAM能存储数据。
原因只有一个。
速度。
RAM虽然比SSD快得多。
但和CPU相比仍然非常慢。
现代CPU可能工作在:
|
1 2 |
4 GHz |
也就是每秒40亿个时钟周期。
而一次RAM访问。
可能需要几十甚至上百个CPU周期。
如果每次加法都要等待RAM。
CPU绝大部分时间都在发呆。
性能将大幅下降。
于是CPU设计师发明了寄存器。
因为寄存器就在CPU内部。
通常一个时钟周期就能访问。
速度远远超过RAM。
这也是现代计算机能够高速运行的重要原因。
第4章 寄存器是如何制造出来的
寄存器不是抽象概念。
它是真实存在的电子电路。
整个结构可以表示为:
|
1 2 3 4 5 6 7 8 |
晶体管 ↓ 逻辑门 ↓ 触发器 ↓ 寄存器 |
其中最关键的元件叫:
Flip-Flop
触发器。
一个触发器可以保存1个比特。
也就是:
|
1 2 |
0 或 1 |
一个64位寄存器。
就包含64个存储位。
这些存储位背后。
由大量晶体管共同组成。
所以寄存器本质上仍然是一种特殊的存储器。
第5章 寄存器与ALU
为了理解寄存器。
我们必须认识另一个重要部件。
ALU。
算术逻辑单元。
ALU负责执行:
加法。
减法。
逻辑与。
逻辑或。
异或。
比较。
移位。
但是ALU并不保存数据。
它只能计算。
例如:
|
1 2 |
5 + 3 |
执行过程可能是:
|
1 2 3 4 5 6 7 8 9 10 |
寄存器A = 5 寄存器B = 3 ALU 结果 = 8 寄存器C = 8 |
ALU从寄存器读取数据。
再把结果写回寄存器。
所以寄存器就是ALU的工作台。
第6章 CPU真正的数据路径
很多人以为CPU工作流程是:
|
1 2 3 4 5 6 |
RAM ↓ ALU ↓ RAM |
事实上并不是。
真正的流程通常是:
|
1 2 3 4 5 6 7 8 9 10 |
RAM ↓ Register ↓ ALU ↓ Register ↓ RAM |
数据先从内存加载到寄存器。
然后ALU使用寄存器中的数据进行计算。
结果再次保存到寄存器。
只有需要时才写回内存。
这是计算机体系结构最重要的概念之一。
第7章 通用寄存器
CPU中最常见的是通用寄存器。
它们专门用于普通计算。
例如:
RISC-V:
|
1 2 |
x0 ~ x31 |
ARM:
|
1 2 |
x0 ~ x30 |
x86:
|
1 2 3 4 5 |
RAX RBX RCX RDX |
这些寄存器保存:
变量。
循环计数器。
地址。
函数参数。
临时结果。
几乎每条指令都会使用它们。
第8章 特殊寄存器
除了通用寄存器。
CPU还有特殊用途寄存器。
例如:
|
1 2 3 4 5 |
PC SP Status Register Instruction Register |
每一个都有专门职责。
没有它们。
CPU根本无法执行程序。
第9章 程序计数器PC
PC。
Program Counter。
程序计数器。
它保存下一条即将执行的指令地址。
例如:
|
1 2 |
PC = 0x1000 |
CPU读取这里的指令。
执行完成后:
|
1 2 |
PC = 0x1004 |
然后继续执行下一条。
如此循环。
每秒几十亿次。
PC就像CPU内部的导航系统。
决定程序执行方向。
第10章 栈指针SP
函数调用需要管理内存。
这时就需要:
Stack Pointer。
栈指针。
栈中通常保存:
返回地址。
局部变量。
函数参数。
每次调用函数。
SP都会移动。
压栈。
出栈。
不断调整。
现代操作系统严重依赖栈结构。
没有SP。
函数调用几乎无法实现。
第11章 状态寄存器
每次计算结束后。
CPU都会记录结果状态。
例如:
结果是否为零?
是否产生进位?
是否溢出?
是否为负数?
这些信息保存在状态寄存器中。
之后CPU可以根据这些状态决定程序流程。
例如:
|
1 2 3 |
如果结果为零 则跳转 |
这就是程序中条件判断的基础。
第12章 寄存器与机器指令
来看一条简单指令:
|
1 2 |
ADD R3,R1,R2 |
意思是:
|
1 2 |
R3 = R1 + R2 |
CPU执行过程:
读取R1。
读取R2。
送入ALU。
执行加法。
结果写入R3。
整个过程完全发生在CPU内部。
根本不需要访问RAM。
这也是寄存器操作速度极快的原因。
第13章 寄存器与编译器
程序员很少直接操作寄存器。
通常写的是:
|
1 2 |
int c = a + b; |
编译器会把它转换成机器指令。
然后使用寄存器完成计算。
编译器有一项重要工作:
寄存器分配。
也就是:
Register Allocation。
编译器需要决定:
哪些变量放进寄存器。
哪些放回内存。
寄存器分配越优秀。
程序运行越快。
第14章 寄存器与流水线
现代CPU使用流水线技术。
一条指令通常经历:
|
1 2 3 4 5 6 |
Fetch Decode Execute Memory Write Back |
多个阶段。
多条指令同时运行。
最后一步:
Write Back。
就是把结果写回寄存器。
流水线中最常见的问题之一。
就是寄存器依赖。
前一条指令还没写完。
后一条指令已经要使用结果。
CPU必须采用复杂机制解决这些冲突。
第15章 为什么寄存器是最快的存储器
在整个存储层级中。
寄存器位于最顶端。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
Registers ↓ L1 Cache ↓ L2 Cache ↓ L3 Cache ↓ RAM ↓ SSD ↓ Hard Drive |
距离CPU越近。
速度越快。
寄存器直接位于CPU核心内部。
因此拥有最高速度。
CPU所有计算最终都围绕寄存器展开。
其它存储结构存在的目的。
本质上都是为了不断向寄存器输送数据。
结论
寄存器是CPU的私人工作区。
它保存当前正在处理的数据。
向ALU提供输入。
接收计算结果。
通过PC跟踪程序执行。
通过SP管理函数调用。
通过状态寄存器控制程序分支。
虽然寄存器容量很小。
现代计算机的核心流程始终是:
|
1 2 3 4 5 6 7 8 9 10 |
内存 ↓ 寄存器 ↓ ALU ↓ 寄存器 ↓ 内存 |
如果说内存是数据居住的地方。
那么寄存器就是数据真正开始工作的地方。
而在下一期视频中。
我们将继续深入CPU内部。
看看真正负责计算的核心部件:
ALU——算术逻辑单元究竟是如何工作的。

