CPU
CPU核心结构
ALU
Arithmetic Logic Unit(算术逻辑单元)的缩写,也叫运算器,专门负责执行算术运算和逻辑运算。
Registers
寄存器,临时存储单元,用来暂存指令、数据和地址。
寄存器根据用途可以分为:
通用寄存器:如 AX、BX、R0、R1 等,主要放操作数、中间结果
专用寄存器:如 PC、IR、SP、PSW 等。
其中比较重要的有:
程序计数器 PC:存放下一条要执行指令的地址。
指令寄存器 IR:存放当前正在执行的指令。
栈指针 SP、链接寄存器 LR:帮助管理函数调用、返回、参数传递和现场保存。
CU
Control Unit(控制单元)的缩写,也叫控制器,它是逻辑功能上独立,但不是像内存条那样可单独插拔的独立芯片。现代 CPU 中,控制单元往往和流水线控制、微码 ROM、分支预测等电路融合在一起,物理上不一定是一个清晰的“单独盒子”。
CPU执行指令细节
CPU 执行一条指令,通常经过以下几个阶段:
1. 取指
PC(程序计数器)存放“下一条指令的地址”。
CPU 把 PC 的内容送到MAR(地址寄存器),再通过地址总线去内存取指令。
内存把指令送回MDR(数据寄存器),再送入IR(指令寄存器)。
PC 自动增加,指向下一条指令;如果遇到跳转,PC 被修改为目标地址。
2. 译码
控制单元读取 IR 中的指令,分析要做什么,比如加法、加载、存储、跳转。
控制单元产生控制信号,指挥 ALU、寄存器文件和内存接口工作。
3. 执行
如果是算术/逻辑指令,比如
ADD R1, R2, R3:从寄存器文件读出 R2、R3 的值;
送入 ALU 运算;
结果写回 R1;
同时更新标志寄存器,如零标志、进位标志、溢出标志。
如果是访存指令,就进入“访存”阶段。
4. 访存
LOAD:从内存读数据到寄存器。STORE:把寄存器里的数据写入内存。
5. 写回
把运算结果或读出的数据写回寄存器。
如果是存储指令,则写回内存。
所以,寄存器是 CPU 执行指令时的“临时工作台”:
PC 管流程,IR 管当前指令,通用寄存器管操作数和结果,标志寄存器管状态,MAR/MDR 管与内存交换地址和数据。
CPU操作内存细节
CPU 不能直接“伸手”改内存,它通过三组总线与内存交互:
地址总线:CPU 告诉内存要访问哪个地址。
数据总线:在 CPU 和内存之间传数据。
控制总线:CPU 发出读/写信号,告诉内存是读还是写。
读内存过程
例如LOAD R1, [1000]:
CPU 把地址
1000放入 MAR;MAR 把地址送到地址总线;
控制单元发出“读”信号;
内存找到地址
1000的内容,放到数据总线;数据进入 MDR;
再写入寄存器 R1。
写内存过程
例如STORE [1000], R1:
CPU 把地址
1000放入 MAR;把 R1 的值放入 MDR;
控制单元发出“写”信号;
内存把数据总线上来的值写入地址
1000。
因此,CPU 操作内存的基本模式就是:
地址送 MAR → 控制总线发读写信号 → 数据经 MDR 进出内存。
现代 CPU 为了更快,还加入了:
缓存 L1/L2/L3:CPU 先查缓存,未命中才访问内存。
MMU/TLB:把虚拟地址转换成物理地址。
流水线:取指、译码、执行、访存、写回重叠进行。
乱序执行、寄存器重命名:提高并行度。
多核缓存一致性:保证多个核心看到一致的内存数据。
但无论多复杂,基本逻辑不变:
CPU 用寄存器做最快的工作台,用总线访问内存,把数据搬到寄存器里运算,再写回内存。
内存
计算机内存的结构
“内存”通常有两种含义:
广义内存层次:寄存器 → L1/L2/L3 缓存 → 主存 → SSD/硬盘。
狭义内存:主存,也就是内存条,通常是 DRAM。
这里重点说主存。
1. 逻辑结构:线性地址空间
从程序员和 CPU 的角度看,内存像一个巨大的线性数组:
地址 0x0000: 1 字节 地址 0x0001: 1 字节 地址 0x0002: 1 字节 ... 地址 0xFFFF: 1 字节
每个存储单元有一个唯一地址。
现代计算机通常按字节编址:一个地址对应 1 个字节(8 位)。
CPU 访问内存时:
地址总线送出地址;
控制总线发出读/写信号;
数据总线传输数据。
2. 物理结构:DRAM 存储阵列
内存条由多块 DRAM 芯片组成。每块 DRAM 内部有:
存储阵列:行和列交叉排列的存储单元;
行解码器、列解码器:根据地址选中某个单元;
灵敏放大器:读出微弱电荷信号并放大;
行缓冲器:暂存一整行数据;
刷新电路:定期刷新电容电荷。
地址通常分两次送入:
先送行地址,触发 RAS;
再送列地址,触发 CAS。
然后选中某个存储单元进行读写。
3. SRAM 与 DRAM
| 类型 | 存储原理 | 特点 | 用途 |
|---|---|---|---|
| SRAM | 双稳态触发器 | 快、贵、不需刷新 | CPU 缓存 |
| DRAM | 电容电荷 | 慢一些、便宜、需刷新 | 主存 |
主存用 DRAM,因为容量大、成本低;缓存用 SRAM,因为速度极快。
内存如何存储数据
1. 一切以二进制位存储
内存中最基本的单位是bit(位),只能表示 0 或 1。
DRAM:用电容是否带电表示 0/1;
SRAM:用触发器电路的两个稳定状态表示 0/1。
多个 bit 组成一个字节:
1 Byte = 8 bit
例如字符'A'的 ASCII 码是 65,二进制是:
0100 0001
它在内存中占 1 个字节,地址假设为0x1000,那么该地址的内容就是0100 0001。
2. 多字节数据如何存放
一个整数、浮点数通常占多个字节。比如 32 位整数占 4 字节。
这 4 个字节在内存中有顺序问题,这就是大端序和小端序:
大端:高位字节放在低地址;
小端:低位字节放在低地址。
x86 和 ARM 通常用小端序。
例如0x12345678存放在地址0x1000:
小端:
78 56 34 12大端:
12 34 56 78
3. DRAM 需要刷新
DRAM 用电容存电荷,电荷会漏掉。
所以内存控制器必须定期把数据读出再写回,这叫刷新。
这也是 DRAM 叫“动态”的原因。
4. 读写过程
读:
CPU 把地址送上地址总线;
内存选中对应行和列;
灵敏放大器读出电荷;
数据经数据总线送回 CPU。
写:
CPU 送地址;
CPU 送数据;
控制总线发出写信号;
内存把电荷写入对应电容。
三、数据大小如何计算
1. 基本单位
| 单位 | 含义 |
|---|---|
| bit | 位,0 或 1 |
| Byte | 字节,1 Byte = 8 bit |
| Word | 字,通常等于 CPU 字长,如 32 位、64 位 |
| KiB | 1 KiB = 1024 Byte |
| MiB | 1 MiB = 1024 KiB |
| GiB | 1 GiB = 1024 MiB |
| TiB | 1 TiB = 1024 GiB |
注意:
内存和操作系统常用二进制:1 KB 有时指 1024 B,严格叫 KiB。
硬盘厂商标称常用十进制:1 GB = 1000 MB = 10^9 B。
所以 8 GB 内存条在系统中显示约 7.45 GiB,这是换算差异。
2. 地址空间计算
如果地址总线有n 位,能表示的地址数量是:
2^n
如果按字节编址,则最大寻址空间为:
2^n 字节
例子:
32 位地址总线:
2^32 B = 4,294,967,296 B = 4 GiB64 位地址总线:
2^64 B = 16 EiB,实际 CPU 不会全用。
3. 内存容量计算
内存容量 = 存储单元数 × 每个单元位数。
若按字节编址:
容量 = 2^地址线数 × 1 字节
若按字编址,每个地址对应一个字:
容量 = 2^地址线数 × 字长
例如:
20 根地址线,按字节编址:
2^20 B = 1 MiB20 根地址线,按 32 位字编址:
2^20 × 4 B = 4 MiB