主存储器
主存储器的基本组成


基本元件
- MOS 管,作为通电 ” 开关 ”
- 电容,存储电容(即存储二进制 0/
译码结构
- 单译码结构:每个存储单元一个地址,通过一个 输入、 输出的译码器直接选择存储单元。
- 原理:当存储器有 个存储单元时,需要 根地址线。单译码结构将这 根地址线直接送入一个 译码器,产生 根输出线,每根输出线唯一对应并选择一个存储单元。
- 特点:
- 译码电路原理简单直观。
- 随着存储容量()的增大,译码器输出线数呈指数级增长(),导致译码器规模庞大,且芯片引脚数过多(至少需要 个输出引脚),这在物理实现上非常困难。
- 主要适用于容量较小,地址线 较少(如 )的存储器芯片。
- 双译码结构:行、列地址译码,将完整的存储单元地址拆分为行地址和列地址两部分,分别送入行译码器和列译码器进行译码,共同确定一个存储单元。
- 原理:
- 对于 个存储单元的存储器,不再使用一个 译码器。通常将 根地址线分为大约相等的两部分,例如 根作为行地址, 根作为列地址。
- 分别使用一个 的行译码器和一个 的列译码器。
- 行译码器选择存储阵列中的一行,列译码器选择该行中的一个特定存储单元,最终定位到唯一的存储单元。
- 芯片引脚数仍为 (或 ,考虑片选等),但译码器内部复杂度大大降低。
- 特点:
- 显著减少译码器规模和芯片引脚数:译码器的最大输出线数从 降至 ,大大简化了译码电路的实现,并降低了芯片封装的成本和复杂度。这是其最主要的优点。
- 适用于大容量存储器芯片:是现代 RAM 芯片(如 DRAM、SRAM)普遍采用的译码方式,有效解决了大容量存储器物理实现的问题。
- 内部控制逻辑相对复杂:需要额外的时序和控制电路来协调行地址和列地址的选通,以及地址线的复用(如 DRAM 中行/列地址分时复用同一组引脚)。
- 原理:
数据存放

- 小端方式:将数据的低字节保存在主存的低地址中,而数据的高字节保存在主存的高地址中。
- 大端方式:将数据的高字节保存在主存的低地址中,而数据的低字节保存在主存的高地址中。
- 没有绝对优劣之分。
数据边界对齐

边界对齐规则
- 基本概念与重要性
- 定义:边界对齐(Boundary Alignment)是指数据在内存中存储时,其起始地址必须是该数据类型字节数的某个倍数的要求。例如,一个 4 字节的数据,其起始地址通常要求是 4 的倍数。
- 目的:
- 提高内存访问效率:CPU 通常以字长(例如 4 字节或 8 字节)为单位从内存中读取数据。如果数据对齐,CPU 可以在一个总线周期内一次性读取完整数据。如果数据未对齐,则可能需要多次内存访问才能获取完整数据,从而降低性能。
- 简化硬件设计:对齐的数据访问模式简化了内存控制器和总线接口的设计,减少了复杂性。
- 兼容性:某些体系结构(如 MIPS、ARM)严格要求数据对齐,否则会导致硬件异常或错误。
- 字节数据不存在边界对齐问题
- 规则:字节(1 字节)是计算机中可寻址的最小单位。内存地址以字节为单位进行编址。
- 含义:任何字节数据都可以存储在内存中的任意地址,其起始地址可以是任意整数,无需满足特定的倍数要求。
- 半字(2 字节)
- 定义:占 2 个字节存储空间的数据单元,例如 C 语言中的
short int类型。 - 对齐规则:其起始地址必须是 2 的倍数。这意味着,半字的地址的二进制表示的最低 1 位必须是 0。
- 定义:占 2 个字节存储空间的数据单元,例如 C 语言中的
- 单字(4 字节)
- 定义:占 4 个字节存储空间的数据单元,例如 C 语言中的
int或float类型。 - 对齐规则:其起始地址必须是 4 的倍数。这意味着,单字的地址的二进制表示的最低 2 位必须是 00。
- 定义:占 4 个字节存储空间的数据单元,例如 C 语言中的
- 双字(8 字节)
- 定义:占 8 个字节存储空间的数据单元,例如 C 语言中的
long long或double类型。 - 对齐规则:其起始地址必须是 8 的倍数。这意味着,双字的地址的二进制表示的最低 3 位必须是 000。
- 定义:占 8 个字节存储空间的数据单元,例如 C 语言中的
- 非对齐访问的影响
- 性能下降:当数据未对齐时,CPU 可能需要执行多次内存访问操作来获取完整数据。例如,一个跨越两个字边界存储的 4 字节数据,可能需要两次内存读取操作,增加了访存周期和总线事务。
- 硬件异常/错误:在某些严格要求对齐的体系结构(如 MIPS、SPARC)中,非对齐访问会触发硬件异常(如对齐陷阱或总线错误),导致程序终止或核心转储。在 x86 等架构中,虽然通常允许非对齐访问,但会带来显著的性能损失。
- 编译器行为与填充:为了遵循对齐规则,编译器在处理结构体(struct)或联合体(union)时,会在成员之间或结构体末尾自动插入填充字节(padding),以确保结构体成员能够正确对齐,并使整个结构体的大小成为其最大对齐要求(或编译器默认对齐值)的倍数。这会影响结构体在内存中的实际大小。
存储芯片的结构
- 译码驱动电路:译码器将地址信号转化为字选通线的高低电平
- 存储矩阵(存储体):由多个存储单元构成,每个存储单元又由多个存储元构成
- 读写电路:每次读 / 写一个存储字
- 读 RD / 写 WR 控制线:决定芯片是进行读还是写操作(可能分开两根,也可能只有一根)
- 片选线 CS:确定哪个存储芯片被选中,可用于容量扩充
- 引脚最低数目:片选线 + 控制线 + 数据线 + 地址线 地址复用技术:
- 由于DRAM 芯片容量大,地址位数多,为了减少地址引脚线,采用地址复用技术
- DRAM 因为分两次发送,长度相同,因此地址线可以复用,线数减少了一半
- 引脚数 = 地址线减半 + 数据线不变 + 行通选 (1) + 列通选 (1) + 读写控制线 (2)
- 片选线用行通选线替代

- 总容量 = 存储单元个数 * 存储字长
- 常见的描述:8 K × 8 位,即 = 8 KB

寻址方式
- 题目上没有明确指定按字编址,那么就默认是按字节编址【一字节 8 位】
- 32 位的计算机中:32 位 (bit) = 4 字节 (byte) = 1 字 (word)
- 64 位的计算机中:64 位 (bit) = 8 字节 (byte) = 1 字 (word)
- 存放一个机器字的存储单元,通常称为字存储单元,相应的单元地址叫字地址
- 存放一个字节的存储单元,称为字节存储单元,相应的地址称为字节地址
- 如果计算机中可编程的最小单位是字存储单元,则该计算机称为按字寻址的计算机
- 如果计算机中可编程的最小单位是字节,则该计算机称为按字节寻址的计算机
- 一个机器字可以包含数个字节,所以一个存储单元也可以包含数个能够单独编制的字节地址

主存储器的组成部分
- 数据线的宽度 = MDR 的宽度 = 存储字长
- 地址线的宽度 = MAR 的宽度 = 存储字数
- 下图总容量 = 位=

DRAM 和 SRAM
SRAM 基本概念




- 静态随机存取存储器 SRAM(Static Random-Access Memory)是随机存取存储器 RAM 的一种。
- 所谓“静态”,是指这种 RAM 只要保持通电,其内部所存储的数据就可以保持不变,而不需要进行周期性地刷新。相比之下,动态随机存取存储器 DRAM (Dynamic Random-Access Memory)则需要。
- 工作原理:SRAM 的每个存储单元通常由六个晶体管(6T)组成一个双稳态触发器来存储一个比特的数据,因此只要供电,数据就能稳定保持。
- 主要特点:
- 速度:存取速度极快,是目前最快的内存。
- 功耗:工作时功耗相对较高,但待机功耗低。
- 集成度:由于每个存储单元包含较多晶体管,集成度较低(单位面积存储容量小)。
- 成本:制造成本高。
- 典型应用:主要用于 CPU 内部的高速缓存(Cache),如 L1、L2、L3 缓存,以及寄存器文件等对速度要求极高的场合。
DRAM 基本概念



- 动态随机存取存储器 DRAM(Dynamic Random-Access Memory)是随机存取存储器 RAM 的一种。
- 所谓“动态”,是指其存储的数据需要周期性地刷新(即重新充电),才能保持数据不丢失。这是因为其存储单元是利用电容存储电荷来表示数据,而电容上的电荷会随着时间泄漏。
- 工作原理:DRAM 的每个存储单元通常由一个晶体管和一个电容(1T1C)组成。晶体管作为开关控制电容的充放电,电容存储电荷来表示数据(有电荷为 1,无电荷为 0)。
- 主要特点:
- 速度:存取速度相对 SRAM 较慢。
- 功耗:刷新操作会消耗额外功耗,但其存储单元结构简单,整体功耗相对较低。
- 集成度:由于每个存储单元结构简单,集成度高(单位面积存储容量大)。
- 成本:制造成本低。
- 典型应用:广泛应用于计算机的主存储器(内存),如 DDR SDRAM 系列。
- 行缓冲器(Row Buffer)
- DRAM 的行缓冲器使用 SRAM 实现
- 主要作用:
- 保存激活行的数据: 它是当前被激活的 DRAM 行的一个副本。
- 避免重复激活: 如果后续的内存访问请求是针对同一行中的不同列(Column)数据(即发生“行命中”或“Row Hit”),那么这些数据可以直接从行缓冲器中获取,而无需再次激活 DRAM 中的原始行。这大大减少了访问延迟,因为激活 DRAM 行是一个相对耗时的操作。
- 支持更快的列访问: 一旦数据被加载到行缓冲器,对同一行内不同列的访问可以非常快速地完成,因为这些访问不再受 DRAM 电荷读写和刷新的限制。
- 支持数据刷新: 在某些架构中,行缓冲器也参与 DRAM 的刷新过程,将数据从缓冲器写回电容器。
DRAM 的刷新
刷新的概念



- DRAM 电容的电荷维持时间短,即使电源不断电,信息也会自动消失
- 因此每隔一段时间必须刷新,一般取 2ms,即刷新周期(再生周期)
- DRAM 的刷新是以行为单位的
- 一次完整的刷新过程只需要占用一个存储周期

集中刷新

- 在规定的一个刷新周期内,对全部存储单元集中一段时间逐行进行刷新,此刻必须停止读 / 写操作
刷新过程
- 用 0.5μs ×128=64μs 的时间对 128 行进行逐行刷新
- 由于这 64μs 的时间不能进行读/写操作,故称为死时间或访存死区”
- 由于存取周期为 0.5μs,刷新周期为 2 ms,即 4000 个存取周期 为什么刷新与存取不能并行
- 因为内存就一套地址译码和片选装置,刷新与存取有相似的过程
- 它要选中一行【这期间片选线、地址线、地址译码器全被占用着】
- 同理,刷新操作之间也不能并行【意味着一次只能刷一行】
分散刷新

- 是指对每行存储单元的刷新分散到每个存取周期内完成
- 其中,把机器的存取周期 tc 分成两段,前半段 tM用来读 / 写或维持信息,后半段 tR用来刷新
刷新过程
- 在每个存取操作后绑定一个刷新操作,延长了存取周期
- 这样存取周期就成了 0.5μs + 0.5μs =1μs
- 但是由于与存取操作绑定,就不需要专门给出一段时间来刷新了
- 这样,每有 128 个读取操作,就会把 0-127 行全部刷新一遍
- 故每隔 128μs 就可将存储芯片全部刷新一遍【即刷新周期是 1μs×128=128μs 远短于 2 ms】
- 而且不存在停止读 / 写的死时间,但是存取周期长了,整个系统速度降低了
- 分散刷新的刷新周期 128μs ,其实不需要这么频繁,会导致浪费
异步刷新

- 既可以缩短“死时间”【仍然存在死时间】,又充分利用最大刷新间隔为 2ms 的特点
刷新过程
- 具体操作为:在 2 ms 内对 128 行各刷新一遍
- 即每隔 15.6μs 刷新一行 (2000μs/128≈15.6μs),而每行刷新的时间仍为 0.5μs
- 这样,刷新一行只能停止一个存取周期
- 但对每行来说,刷新间隔时间仍为 2 ms,而死时间为 0.5μs
- 相对每一段来说,是集中式刷新,相对整体来说,是分散式刷新 特点
- 将 DRAM 的刷新安排在 CPU 对指令的译码阶段,这个阶段 CPU 不访问存储器
- 既克服了分散刷新需独占 0.5μs 用于刷新,使存取周期加长且降低系统速度的缺点
- 又不会出现集中刷新的访存“死区”问题
- 从根本上提高了整机的工作效率
SDRAM

SRAM 与 DRAM 对比
| SRAM | DRAM | |
|---|---|---|
| 主要用途 | 高速缓存 | 主机内存 |
| 存储信息 | 双稳态触发器(通常 6T) | 电容充放电(通常 1T1C) |
| 破坏性读出 | 非,即使信息被读出后,它仍保持其原状态而不需要再生 | 是 |
| 需要刷新 | 无需周期性刷新 | 需周期性刷新 |
| 送行列地址 | 同时送 | 分两次送 |
| 运行速度 | 快 | 慢 |
| 集成度 | 低(单位容量成本高) | 高(单位容量成本低) |
| 存储成本 | 高 | 低 |
| 典型应用 | CPU 高速缓存(Cache)、寄存器文件 | 计算机主存储器(内存) |
只读存储器 ROM


ROM 的特点
- 结构简单,位密度比可读写存储器高
- 具有非易失性,可靠性高
ROM 的类型


掩模式只读存储器 MROM
- 内容在生产过程中写入,任何人不可重写
- 可靠性高,集成度高,价格便宜但灵活性差
一次可编程只读存储器 PROM
- 用于用户实现一次性编程
- 一次写入后不可更改
可擦除可编程只读存储器 EPROM
- 用于用户实现多次性编程
- 可多次重写,但次数有限,写入时间过长
Flash 存储器
- 既可在不加电的情况下长期保存信息,又能在线进行快速擦除和重写
- 需要先擦除后写入,写速度一般比读速度慢
- 每个存储元只需要单个 MOS 管,位密度比 RAM 高
- U 盘就是基于 Flash 的只读存储器
- 价格便宜,集成度高,电可擦除重写且擦除重写速度快
固态硬盘 SSD
- SSD 是基于闪存的硬盘,是一种非易失性存储器,采用随机访问方式
- 由控制单元和存储单元(Flash 芯片)组成
- 可长期保存信息,快速擦除和重写
- 相比传统硬盘也有读写速度快、低功耗的特性,但价格较高
多模块存储器
概念
- 一种空间并行技术,利用多个结构完全相同的存储模块的并行工作来提高存储器的吞吐率
单体并行存储器
- 定义:存储器中只有一个存储体,每个存储单元存储 m 个字,总线宽也为 m 个字,地址必须顺序排列并处于同一存储单元
- 过程:在一个存取周期内,从同一地址取出 m 条指令,然后将指令逐条送至 CPU
- 缺点:指令和数据在主存内必须是连续存放的,一旦遇到转移指令,或操作数不能连续存放,这种方法的效果就不明显

多体并行存储器
由多体模块组成,每块都有相同容量和读取速度,各模块都有独立的读写控制电路、MAR 和 MDR,既能并行工作也能交叉工作
高位交叉编址(顺序方式)【竖】
- 特点:先在一个模块内访问,等到该模块访问完之后才转到下一个模块访问
- 编号:高位地址表示体号【模块号】,低位地址表示体内地址
- 优点:
- 某个模块进行存取时,其它模块不工作
- 某一模块出现故障时,其它模块可以照常工作
- 通过增添模块来扩充存储器容量比较方便
- 缺点:各模块串行工作,存储器的带宽受到了限制,并不能提高吞吐量

低位交叉编址(交叉方式)【横】
- 特点:
- 连续地址分布在相邻的不同模块内,同一模块内的地址是不连续的
- 地位交叉编制是交叉存放的,满足程序的局部性原理
- 编号:高位地址表示体内地址,低位地址表示体号【模块号】
- 优点:对连续字的成块传送可实现多模块并行存取,提高了存储器的带宽
- 计算:每个模块按“模 m”交叉编址,模块号 = 单元地址 % m

不能同时启动 M0 和 M1 的原因:3r 周期后,两者同时传输数据,总线会发生争用。
- 启动方式:
-
轮流启动方式:
- 设模块字长等于数据总线宽度,模块存取周期为 T,总线周期为 r
- 存储器交叉模块的数目最小为 m = T / r
- 每隔 1/m 个存取周期轮流启动各模块,则每隔 1/m 个存取周期就可读出或写入一个数据,存取速度提高 m 倍
- 当模块数目不小于 m 时,就可以保证 T 时间之后再启动该模块,上次的存取操作已经完成,流水线就不会断
- **连续存取 m 个字的时间为 T + (m - 1) r
- 判断发送访问冲突的规则:给定的访存地址在相邻的四次访问中出现在同一个存储模块中【m=4 时】

-
同时启动方式:
- 所有模块一次并行读 / 写的总位数正好等于数据总线位数
- 同时启动所有模块进行读 / 写
-
- 计算带宽

主存储器与 CPU 的连接
连接原理
- 主存储器通过数据总线、地址总线和控制总线与 CPU 连接
- 数据总线的位数与工作频率的乘积正比于数据传输速率
- 地址总线的位数决定了可寻址的最大内存空间
- 控制总线(读 / 写)指出总线周期的类型和本次输入 / 输出操作完成的时刻
- CPU 读指令,通过地址线去访问存储器的 MAR(地址寄存器)
- MAR(地址寄存器)通过选通线去访问矩阵中的数据
- 矩阵需要通过数据线与 MDR(数据寄存器)进行接发
主存容量的扩展
位扩展法
- 的存储器 = 8 片 的 RAM 组成
- 地址线并行,数据线一一接上


字扩展法
-
线选法
- 的存储器 = 2 片 的存储器
- 地址线是 ~ 共 13 位,译码线是 和 共 2 位
- 由片选信号来区分各芯片的地址范围
- 当 为 1 时,第一块工作, 的 CS 必须为 0
- 谁工作,数据线就接送谁的数据,即将 CS 设置为 1
- 2 位二进制时:只能利用 01,10

-
译码片实现
- 有 4 块芯片,不需要 4 条线而只需要两条
- 地址线是 ~ 共 13 位,译码线是 和 共 2 位
- 2 位二进制时:可以利用 00,01,10,11
- 【译码器】一个二进制转十进制的物理元件,将左边三根地址线表示的二进制意义映射到右边十进制的选通线



比较

字位同时扩展法
- 一块芯片只有 4 位,因此通过 2 片叠加先实现位拓展
- 等价于实现了一个 8 位的存储芯片
- 再通过译码片选的方式实现字拓展
- 在不同的地址线中选择不同的芯片组合进行工作

