[TOC]

计算机存储器系统深度解析笔记

2. 主存的核心概念与性能指标

2.1 主存的定义与访问特性

核心定义:主存(内存)是机器指令直接操作的存储器,需基于"存储地址"实现随机访问(Random Access),即通过地址可直接定位任意存储单元,无需顺序查找。

存储层级结构

  • 存储元件:最小存储单位,仅能存储1位二进制数(0或1),如一个晶体管或电容元件
  • 存储单元:由若干存储元件组成,可存储"一串二进制信息"
  • 存储字:存储单元中存放的"一串二进制信息"
  • 存储字长:存储字的二进制位数,常见8位(1字节)、16位、32位、64位

主存容量公式

$$
\text{主存容量} = \text{存储字长(bit)} \times \text{存储单元数量} = \text{存储字长} \times 2^{\text{MAR位数}}
$$

深度理解:MAR(存储器地址寄存器)的每一位决定一个地址位,n位MAR可寻址$2^n$个存储单元。例如,32位地址总线可寻址$2^{32}=4\text{GB}$的内存空间。


2.2 主存的三大硬件组成部分

2.2.1 存储体

功能:主存的"数据存储核心",由大量存储单元按规则排列构成,是二进制数据的最终载体。

结构关系:存储体 → 存储单元 → 存储元件(1位),形成"整体-局部-最小单位"的层级。

2.2.2 存储器数据寄存器(MDR)

功能:暂存两类数据

  1. 从存储体某单元读出的信息(准备送往CPU)
  2. CPU准备写入存储体某单元的信息(暂存后等待写入)

关键特性:MDR的位数必须与存储字长相等。若存储字长为8位,MDR也为8位,确保能完整容纳1个存储字。

2.2.3 存储器地址寄存器(MAR)

功能:存放"欲访问的存储单元的地址"(相当于主存的"门牌号登记表")

关键特性:MAR的位数决定主存可容纳的存储单元总数,计算公式为:

$$
\text{存储单元总数} = 2^{\text{MAR位数}}
$$

原理:n位二进制数可表示$2^n$种不同地址,对应$2^n$个存储单元。

例题:若MAR为16位,MDR为16位,求主存容量。

  • 解:存储单元数=$2^{16}=65536$,存储字长=16位
  • 容量=16bit×65536=1,048,576bit=128KB

2.3 存储器性能指标

2.3.1 存取时间(Access Time)

定义:启动一次存储器操作(读出/写入)到操作完成所经历的时间,反映"单次读写有多快"。

分类

  • 读出时间:从发出"读指令"到数据从存储器传输到MDR的时间
  • 写入时间:从发出"写指令"到数据从MDR写入存储器的时间

关键特点:读出时间与写入时间可能不相等(通常写入时间略长)。

2.3.2 存取周期(Memory Cycle Time)

定义:连续两次访问存储器(两次读、两次写或一读一写)的最短时间间隔,反映"连续读写的最小间隔"。

与存取时间的关系

  • 存取周期 = 存取时间 + 恢复时间
  • 结论:存取周期略大于存取时间(如某内存存取时间10ns,存取周期12ns,其中2ns为稳定恢复时间)

深度理解:恢复时间是存储器内部电路完成信号稳定、电荷均衡等过程所需的时间,类似于"冷却时间"。

例题:某SRAM存取时间为8ns,恢复时间为2ns,求最大数据传输率。

  • 解:存取周期=8+2=10ns
  • 最大传输率=1/10ns=100MHz

2.3.3 存储器带宽(Bandwidth)

定义:单位时间内存储器能传输的二进制信息总量,反映"数据传输速率",单位为bit/s、Byte/s(常用KB/s、MB/s、GB/s)。

计算公式

$$
\text{存储器带宽} = \frac{\text{单次传输数据量(bit)}}{\text{存取周期(s)}}
$$

影响因素

  1. 单次传输数据位宽:位宽越大,单位时间传输量越多(如64bit比32bit快一倍)
  2. 存取时间:时间越短,单位时间传输次数越多

记忆要点:带宽=位宽÷周期,两者缺一不可。高频内存(短周期)+宽总线(多位宽)=高带宽。


3. 存储器的译码结构

3.1 单译码结构(线性译码)

核心原理:仅使用一个地址译码器,将N位地址信号直接译为$2^N$条译码输出线,每条线对应一个存储单元。

适用场景:小容量存储器(N≤10时较合理,$2^{10}=1024$条线尚可接受)。

缺点:当N较大时,译码输出线数量爆炸式增长($2^{20}=1,048,576$条线),硬件实现困难。

3.2 双译码结构(二维译码)

核心原理:将存储单元排列成"二维阵列"(行×列),使用两个独立译码器:

  1. 地址拆分:N位地址分为两部分(通常等分为N/2位),分别送行地址译码器列地址译码器
  2. 行选通:行译码器输出"行选信号",选中某一行的所有存储单元
  3. 列选通:列译码器输出"列选信号",选中某一列的所有存储单元
  4. 单元定位:行选与列选的"交集"对应唯一存储单元

优势:将$2^N$条线优化为$2^{N/2}+2^{N/2}=2\times2^{N/2}$条线。如N=20时,仅需$2^{10}+2^{10}=2048$条线,而非1,048,576条。


4. 机器字长与存储字长

4.1 核心定义与区别

术语 定义 关键说明
机器字长 CPU一次能处理的二进制数据位数 决定CPU运算能力,常见32位、64位
存储字长 主存中一个存储单元能存储的二进制位数 决定主存单次读写的基本数据量
关系 无强制相等关系,存储字长通常是字节的2ⁿ倍 32位CPU的存储字长可设为16位、32位或64位

深度理解:机器字长是CPU的"能力",存储字长是主存的"结构",两者通过MDR协调。理想情况下两者匹配可减少访存次数。

4.2 例题分析

题目:已知某计算机CPU为64位机器字长,主存存储字长设计为32位。CPU执行一次64位数据运算时,需要从主存读取几次数据?若存储字长改为64位,读取次数如何变化?

解析

  • 32位存储字长:需读取$64÷32=2$次,第一次取低32位,第二次取高32位
  • 64位存储字长:仅需读取$1$次,单次即可获取完整64位数据

结论:存储字长与机器字长匹配时,可减少主存访问次数,提升效率约50%。


5. 地址访问模式与编址方式

5.1 主存按字节编址

基础规则:主存默认按字节编址(每个字节对应唯一地址,1字节=8位),存储字长是字节的$2^n$倍。

多粒度访问类型

访问类型 对应字节数 存储字长要求 地址特征(32位机)
字节访问 1字节 无特殊要求 地址可为任意值
半字访问 2字节 ≥2字节 地址最低1位为0(偶数地址)
字访问 4字节 ≥4字节 地址最低2位为00(4的倍数)
双字访问 8字节 ≥8字节 地址最低3位为000(8的倍数)

易错点:半字地址不是简单的"除以2",而是地址必须是对齐的。

5.2 地址转换关系

转换规则:以字节地址为基础,不同访问类型需逻辑右移n位(n为访问字节数的对数)

  • 字节→半字:右移1位($÷2$)
    • 例:字节地址0x0004→半字地址0x0002
  • 字节→字:右移2位($÷4$)
    • 例:字节地址0x0008→字地址0x0002

深度理解:右移操作相当于"去掉最低位",因为多字节访问时,低位地址用于内部字节选择。

5.3 汇编指令示例(Intel x86)

  • MOV AL, [0x0001]字节访问,将地址0x0001处的1字节数据送入AL寄存器(8位)
  • MOV AX, [0x0002]半字访问,将地址0x0002~0x0003处的2字节数据送入AX寄存器(16位)
  • MOV EAX, [0x0004]字访问,将地址0x0004~0x0007处的4字节数据送入EAX寄存器(32位)

关联知识点:地址对齐不当会导致"总线错误"或性能下降,现代CPU支持非对齐访问但会触发多次总线周期。


6. 数据字节序:大端与小端

6.1 核心定义

存放方式 定义 优势
小端(Little-Endian) 低字节存于低地址,高字节存于高地址 符合地址与数据位权的逻辑,CPU运算效率高
大端(Big-Endian) 高字节存于低地址,低字节存于高地址 符合人类读写习惯,便于调试观察

6.2 实例对比(32位数据0x12345678)

地址 小端方式 大端方式
0x0000 0x78(低字节) 0x12(高字节)
0x0001 0x56 0x34
0x0002 0x34 0x56
0x0003 0x12(高字节) 0x78(低字节)

记忆口诀:小端"低位在前",大端"高位在前"。

6.3 例题解析

题目:某计算机采用小端方式,主存地址0x0002~0x0005处的字节数据依次为0x88、0x77、0x66、0x55。若按32位字访问(地址0x0002),读取的数据是多少?

解析

  • 小端规则:低地址→低字节,高地址→高字节
  • 地址0x0002(低)→0x88,0x0005(高)→0x55
  • 拼接顺序:高字节→低字节 = 0x55 0x66 0x77 0x88
  • 结果:0x55667788

易错点:小端方式下,从内存看是"乱序",但CPU读取后是正确数值。


7. 数据的边界对齐

7.1 核心目的

减少CPU访问主存的次数(提升效率)。若数据未对齐,CPU需多次读取并拼接,增加延迟;对齐后可单次读取。

性能影响:未对齐访问性能下降可达50%~100%(触发多次总线周期)。

7.2 对齐规则(按字节编址)

数据类型 字节数 起始地址要求(最低n位) 合法/非法地址示例
char 1 无要求 合法:任意地址
short 2 最低1位为0(2的倍数) 合法:0x0002;非法:0x0003
int 4 最低2位为00(4的倍数) 合法:0x0004;非法:0x0005
double 8 最低3位为000(8的倍数) 合法:0x0008;非法:0x0009

编程规范:编译器默认会插入"填充字节"(padding)实现自动对齐。

7.3 结构体对齐例题

题目:32位系统下,定义结构体struct Data { char a; int b; short c; };,求总字节数(不考虑编译器优化)。

解析

  1. 成员a(char):起始地址0x0000,占用1字节(0x0000)
  2. 成员b(int):需对齐到4的倍数,从0x0004开始,占用0x0004到0x0007(0x0001到0x0003为内存空洞,浪费3字节)
  3. 成员c(short):需对齐到2的倍数,从0x0008开始,占用0x0008~0x0009
  4. 总字节数:0x0009-0x0000+1=10字节(含3字节空洞)

优化策略:调整成员顺序为char a; short c; int b;,总字节数可优化为8字节(无空洞)。


8. SRAM存储器

8.1 SRAM的定义与结构归属

全称:静态随机存取存储器(Static Random Access Memory)

核心特征:"静态"指通电状态下,数据无需周期性刷新即可持续保持。

易失性属性:SRAM与DRAM均为易失性存储器(断电数据丢失),ROM为非易失性存储器。

存储器类型 是否需要刷新 易失性 典型应用
SRAM 否(静态) CPU Cache
DRAM 是(动态) 主存
ROM 否(非易失) BIOS

8.2 SRAM存储元工作原理

核心组成:8个MOS管构成(T1~T8),功能分工明确:

MOS管 功能分类 核心作用 等效理解
T1、T2 工作管 构成反相器,存储二进制位 数据存储核心
T3、T4 负载管 提供稳定偏置电压,维持状态 上拉电阻
T5~T8 门控管 控制存储元与位线通断 开关阀门

工作原理:利用双稳态电路(T1-T2交叉耦合)保持数据,无电荷泄漏问题。

8.3 SRAM读操作流程

前提条件:行选通线X、列选通线Y均输入高电平(1),门控管T5~T8导通。

核心流程

  1. 存储元内部稳定电平(如A高B低)通过导通门控管传递到位线
  2. 位线IO与IŌ的电平信号输入差分放大器,通过检测电流方向差异还原数据
  3. 关键特性:读操作不破坏原有数据,A、B点电平保持不变

8.4 SRAM写操作流程

前提条件:与读操作一致,X、Y线为高电平。

以"写0"为例(假设原存"1",状态A高B低):

  1. 向位线IO输入低电平,IŌ输入高电平
  2. 低电平通过T5传递到A点,将A点拉低
  3. A点低→T2截止→B点被T3上拉为高电平
  4. B点高→T1导通→A点通过T1接地,保持低电平
  5. 最终形成稳定状态"A低B高",完成写0

写操作本质:通过外部位线强制改变A、B点电平,打破原有稳态,建立新稳态。

8.5 SRAM核心特点总结

特点 SRAM(静态) DRAM(动态)
数据保持 无需刷新,通电即稳定 需定期刷新(64ms/次)
读写速度 快(1-10ns) 慢(10-100ns)
用管数量 8个/存储元 1个/存储元
芯片面积/成本 面积大,成本高 面积小,成本低
功耗 高(持续供电) 低(仅刷新时耗电)
典型应用 CPU Cache(L1/L2/L3) 主存(DDR4/DDR5)

例题:下列设备中最可能使用SRAM的是?
A. 笔记本内存 B. CPU的L1缓存 C. U盘 D. 硬盘

答案:B。CPU缓存需GHz级速度,SRAM的无刷新特性完美匹配。笔记本内存用DRAM(A错),U盘/硬盘为非易失存储(C/D错)。


9. DRAM存储器

9.1 DRAM存储元结构

核心元件:1个增强型MOS管 + 1个存储电容C

电路连接

  • MOS管漏极→存储电容C
  • 电容另一端→接地(GND)
  • MOS管源极→位线(列线)
  • MOS管栅极→字线(行线)

物理尺寸:电容容量约几十飞法(fF),充电速度<10ns。

9.2 DRAM数据表示原理

二进制数据 实现方式 关键过程
1 电容C充满电荷 字线高电平→MOS管导通→位线提供VCC→电容充电至VCC
0 电容C完全放电 字线高电平→MOS管导通→电容通过位线放电→电荷释放至GND

初始状态:上电后电容电荷状态随机,需通过写操作初始化。

9.3 DRAM破坏性读与动态刷新

9.3.1 破坏性读

现象:读取"1"时,电容通过导通的MOS管向位线放电,导致电荷流失,数据从"1"→"0"。

解决方案数据恢复——读取后立即通过位线向电容重新充电,由灵敏读出恢复放大器自动完成。

例题:若DRAM存储元存"1",未恢复时连续读2次,第2次结果?

  • 答案:0(第一次读取已破坏数据)

9.3.2 动态刷新

原因:MOS管存在漏电流,电容电荷会缓慢泄漏,"1"的电荷通常只能保持64ms

刷新机制:定期(每64ms)对所有存储元执行"伪读操作",通过导通MOS管检测电荷,不足则补充。

刷新开销:约占系统总时间的1%~2%,现代DRAM采用隐藏刷新(在CPU不访问时进行),不影响性能。

9.4 DRAM存储阵列扩展

扩展原理:将多个存储元排列为二维阵列(行×列),实现行列寻址。

关键概念

  • 寄生电容:列线因连接多个MOS管,自身存在的非设计性电容(约为存储电容的10倍)
  • 灵敏放大器:每列配备,核心功能为预充电、信号检测、数据恢复

9.5 DRAM读操作完整流程(五步)

以读取"第2行第3列存储元(数据为1)"为例:

  1. 预充电:将所有列线电压充至VCC/2(如1.65V),随后关闭预充电电路
  2. 访问:第2行行线置高电平→该行所有MOS管导通→第3列存储电容向列线放电→列线电压升至1.65V+ΔV(ΔV约0.1-0.5mV)
  3. 信号检测:灵敏放大器检测ΔV,电压升高判定为1
  4. 数据恢复:放大器将列线电压拉至VCC(3.3V),通过导通的MOS管向存储电容重新充电
  5. 数据输出:第3列列选通信号有效→列线数据通过I/O接口输出到CPU

9.6 DRAM写操作流程

前四步与读操作完全相同(预充电→访问→检测→恢复),目的是维持该行所有存储元的数据。

第五步:数据输入——外部数据通过I/O送至列线,放大器将列线电压拉至对应电平(1→VCC,0→GND),通过导通的MOS管写入存储电容。

9.7 DRAM地址复用技术

技术目的:减少地址引脚数量(针对大容量DRAM,降低芯片封装复杂度)

实现原理:行地址线与列地址线分时复用同一组地址引脚

  • 行地址选通信号(RAS,低有效):锁存行地址
  • 列地址选通信号(CAS,低有效):锁存列地址

考研真题解析(2018年408)

题目:DRAM芯片规格为2K×1位,采用地址复用技术,为减少刷新开销,行/列地址线应如何分配?

解题步骤

  1. 总地址线需求:$2K=2^{11}$→需11条地址线
  2. 两种分配方案:
    • 方案一:行6条+列5条→行选通线$2^6=64$条
    • 方案二:行5条+列6条→行选通线$2^5=32$条
  3. 最优方案:行选通线越少→刷新次数越少→开销越小
  4. 答案:行5条、列6条(32行×64列结构)

记忆要点:刷新是按进行的,行数越少刷新越快。

9.8 SRAM与DRAM综合对比

对比维度 SRAM DRAM
速度 快(1-10ns) 慢(10-100ns)
成本 高(8管/元) 低(1管1容/元)
集成度 高(约为SRAM的4倍)
功耗 高(持续供电) 低(仅刷新耗电)
刷新 不需要 需要(64ms/次)
地址线 独立 复用(RAS/CAS)
应用 Cache(速度优先) 主存(容量优先)

10. 存储器扩展技术

10.1 字扩展(仅扩容,位宽不变)

适用场景:单芯片位宽匹配CPU数据总线,但容量不足。

核心步骤

  1. 计算芯片数芯片数 = 目标容量 ÷ 单芯片容量
  2. 分配地址线
    • 片内地址线:由单芯片容量决定($2^n=单芯片容量$)
    • 片选地址线:由芯片数决定($2^m=芯片数$)
  3. 译码器选择:用片选地址线经译码器生成片选信号
  4. 公共信号并联:地址线(片内部分)、数据线、控制线全部并联

例题:CPU数据总线8位,地址总线21位;单SRAM为256K×8位,构建2M×8位存储器。

解答

  1. 芯片数 = $2M ÷ 256K = 8$片
  2. 地址线分配:
    • 片内地址:$256K=2^{18}$→$A_0~A_{17}$(18根)
    • 片选地址:$A_{18}~A_{20}$(3根,对应8片)
  3. 译码器:3-8译码器(输入3位,输出$\overline{Y_0}~\overline{Y_7}$)

10.2 位扩展(仅加宽位宽,容量不变)

适用场景:单芯片容量匹配,但位宽小于CPU数据总线。

核心步骤

  1. 计算芯片数芯片数 = 目标位宽 ÷ 单芯片位宽
  2. 公共信号并联:地址线、控制线、片选线全部并联
  3. 数据线拼接:各芯片数据线按位拼接

例题:单芯片为1K×4位,构建1K×8位存储器。

解答

  1. 芯片数 = $8÷4=2$片
  2. 连接逻辑:
    • 地址线:$A_0~A_9$并联
    • 控制线:$\overline{OE}$、$\overline{WE}$并联
    • 片选线:$\overline{CS}$并联
    • 数据线:片1输出$D_0~D_3$,片2输出$D_4~D_7$

10.3 字位同时扩展(既扩容又加宽)

适用场景:单芯片既容量不足,位宽也不匹配。

核心步骤

  1. 计算总芯片数总芯片数 = 字扩展数 × 位扩展数
  2. 先位扩展:拼成"1组与目标位宽一致的模块"
  3. 后字扩展:用译码器对多组模块做片选
  4. 统一连接:保持公共信号并联

例题:单芯片为1K×4位,构建4K×8位存储器。

解答

  1. 计算:
    • 位扩展数 = $8÷4=2$片/组
    • 字扩展数 = $4K÷1K=4$组
    • 总芯片数 = $4×2=8$片
  2. 扩展逻辑:
    • 位扩展:每2片拼成1K×8位模块(4组)
    • 字扩展:用2-4译码器控制4组模块的片选
    • 最终:4组×1K=4K容量,8位位宽

10.4 三种扩展方式对比

扩展类型 核心变化 芯片数计算 关键连接点
字扩展 容量↑,位宽不变 目标容量÷单芯片容量 译码器分片选
位扩展 位宽↑,容量不变 目标位宽÷单芯片位宽 数据线拼接
字位同时扩展 容量↑+位宽↑ 字扩展数×位扩展数 先位扩展拼组,再字扩展分片选

考研高频:字扩展考查译码器选择,位扩展考查数据线连接,字位同时扩展考查综合设计能力。


考研真题实战

2012年408真题(边界对齐应用)

题目:主存按字节编址,Cache块大小4字节,主存块号3对应的Cache块,其主存地址范围是?

解析

  • 块大小4字节→块内偏移占2位($2^2=4$)
  • 块号3→地址结构:块号(高位)+ 偏移(低位)
  • 偏移范围00~11(0~3)
  • 地址范围 = 块号×块大小 ~(块号+1)×块大小-1
  • 计算:$3×4=12$(0x0C)~$3×4+3=15$(0x0F)

答案:0x0C~0x0F(对应选项D)

2018年408真题(小端+补码)

题目:小端方式存放,CPU读取地址0x100处的16位补码整数0x8000,其十进制值是?

选项:A. -32768 B. -128 C. 128 D. 32768

解析

  1. 小端方式:0x100存低字节0x00,0x101存高字节0x80
  2. 拼接后仍为0x8000(二进制1000 0000 0000 0000)
  3. 补码转十进制:
    • 最高位1→负数
    • 数值位取反加1:0111 1111 1111 1111 + 1 = 1000 0000 0000 0000(32768)
    • 结果:-32768

答案:A


易错点总结与记忆技巧

  1. 存取周期≠存取时间:周期=时间+恢复,总是更大
  2. MAR位数决定容量:$2^n$关系,不是线性
  3. 小端/大端是字节序:不是位序,是每个字节的排列顺序
  4. 对齐地址特征:2字节→偶数,4字节→4的倍数,8字节→8的倍数
  5. SRAM/DRAM选择:速度优先→SRAM,容量优先→DRAM
  6. 地址复用目的:减少引脚,刷新按行→行数越少越好