📑 本页目录
计算机原理与嵌入式系统 · 配套学习整理
存储器怎样存信息
CPU 怎样找到它第三章 · 存储器系统
从保存一位信息的电路,到多片芯片的连接;从 Cache 地址映射,到虚拟地址转换。每一步都落到“题目里怎样判断、怎样计算”。
完整覆盖原讲义 3.1—3.6 和 3.7 的全部 29 道习题。页码按第三章单独讲义:第 1 页为目录,正文及习题在第 2—50 页。沿用前两章的离线文件版式。
存什么、怎么保持 → 怎样连接与扩展 → 怎样加速访问 → 怎样转换地址
从容量与地址开始 →先把四类问题分开
别把器件、接线、缓存与地址管理混成一团
这一章跨越四个层面:器件怎样保持状态,芯片怎样组成更大的存储器,CPU 怎样少等数据,操作系统怎样组织地址。每个新名词先放回它负责的问题里,再看它与上下层怎样联系。
| 问题 | 对应内容 | 掌握标准 |
|---|---|---|
| 信息能存在哪里? | 磁、光、RAM、ROM、Flash | 能比较原理、断电保持、读写方式和用途。 |
| 怎样组织足够大的存储器? | 容量、地址、CPU 连接与扩展 | 会算容量、地址线、芯片数、地址范围,会画组织关系。 |
| 主存跟不上 CPU,怎么办? | Cache | 会拆地址、求候选位置、模拟替换并解释更新。 |
| 程序地址怎样映射和隔离? | 段、页、段页式与 TLB | 会按表项走转换路径,区分未命中、缺页和权限错误。 |
每节开头注明“掌握要求”和“背景为什么要讲”。要求依据章后习题及后续知识依赖划分,不代表已知你的考试范围。必须会做的内容要离开示范重新算;背景内容也完整交代用途,但不用把每个旧型号参数都背成公式。
12 幅图都保存在本文件中。带下拉框、输入框或按钮的图可以改变条件;章末答案默认折叠。打印时显示答案,并采用图解默认示例。外部链接仅供核对,正文、公式与图解离线可用。
第三章 · 第 01 节
先把容量、地址、位宽分清
掌握要求:不看提示能由 N×M 算容量、地址位数,区分按字与按字节编址。
背景为什么要讲:扩展、Cache、分页都依赖这套单位关系;先把“一个地址选什么”说明白。
这一段直接决定容量题和扩展题能不能做对。
位 bit,是一个 0 或 1。字节 Byte,是 8 位
因此:
大写 B 和小写 b 不一样。例如:
这里暂时按同一种数量级换算,核心就是除以 8。
本讲义在计算题中沿用二进制习惯:
严格区分时,1024 字节应写作 1KiB。做本章题,按讲义的二进制约定计算。
“字”需要看上下文
在存储芯片的容量表达式里:
意思是:
有 4K 个可选择的存储单元,每个单元保存 8 位。
你可以把它想成 4096 个抽屉,每个抽屉能放 8 个二进制位。
所以总容量:
而:
表示抽屉数量仍是 4096 个,每个抽屉扩大到 16 位,因此容量是:
注意:这里的“一个字”,是芯片一次选出的一个存储单元,不一定等于 CPU 的机器字。
教材说“32 位计算机一个机器字常为 4 字节”,这是 CPU 字长的语境;4K×8 中的单元宽度,则由这个芯片的组织方式决定。
地址是抽屉编号,数据是抽屉内容
如果有 位地址,就能组成:
种编号。
例如 12 位地址能选择:
个单元,地址从 0 到 4095。
因此,对一个地址不复用、每个地址选一个单元的普通芯片:
举例:
| 芯片组织 | 地址位数 | 数据位宽 | 总容量 |
|---|---|---|---|
| 10 | 8 | 1KB | |
| 12 | 8 | 4KB | |
| 12 | 16 | 8KB | |
| 16 | 1 | 8KB | |
| 20 | 8 | 1MB |
后面讲 DRAM 时你会看到:地址位数和芯片外部地址引脚数,也可能不同,因为地址可以分两次传入。
再区分按字节编址和按字编址
按字节编址:
每个地址编号对应 1 字节。
按字编址:
每个地址编号对应一个字,字有多少字节要看题目。
所以:
这是本章最容易错的公式之一。先判断一个地址对应多少字节,再算容量。
第三章 · 第 02 节
3.1 存储器的类型、层次、接口与性能
掌握要求:会按不同依据分类,解释主存/外存,比较延迟、周期和带宽。
背景为什么要讲:历史器件和接口版本全部认识用途;年代、线缆长度和旧版本速率以查表为主。
“磁存储器”“主存”“RAM”这些词,使用的分类标准并不相同。
- 按存储介质分:磁、半导体、光。
- 按系统中的作用分:寄存器、Cache、主存、外存。
- 在本章讨论的半导体器件中,按读写和保持特性分:RAM、ROM 等。
例如,SSD 同时是:
半导体存储器、外部辅助存储器、主要使用 NAND Flash 的存储设备。
这几种说法并不冲突。
磁存储器:利用磁化状态保存信息
本章提到的类型:
- **磁盘:**HDD、软盘。磁头定位到盘面上的位置进行读写。
- **磁带:**磁头读取移动的带状介质;访问远处内容往往需要先移动磁带。
- **历史器件:**磁泡、磁鼓、磁芯。
要会解释的共同特点是:本章这些磁存储介质能在断电后保持信息。
磁盘和磁带的差别,可以这样记:
磁盘适合定位访问不同位置;磁带偏向顺序访问。
磁鼓、磁芯为什么要讲?它们说明“主存”是一种系统角色,历史上的主存并不一定是半导体器件。讲义还提到王安与磁芯“读后即写”技术,这是发展背景;本章做题重点是类型与工作原理,人物和年代认识即可。
光存储器:用光读取介质上的状态变化
讲义用激光和反射光变化解释光盘读取。光驱包括激光头、光电转换电路、旋转和定位机构。
本章提到 CD-DA、CD-ROM、VCD、DVD:
- CD-DA 主要用于数字音频;
- CD-ROM 用于数据;
- VCD、DVD 常用于视频等内容。
这里要掌握的是“介质上的光学特征怎样转成电信号”,以及典型形式。不需要为了本章习题背激光头内部每个部件的形状。
半导体存储器:利用电子电路或器件状态保存信息
本章主要分成:
- **SRAM、DRAM:**用于快速、频繁地读写运行中的信息。
- **ROM、EEPROM、Flash 等:**用于断电后仍要保留的信息。
先建立一个基础判断:
程序运行时不断变化的变量,适合放 RAM;上电后还要存在的程序或配置,适合放非易失性存储器。
后面会进一步区分这些器件。
为什么需要多级存储?因为速度、容量、成本不能同时都做到最优
你可以把它理解成:
手里正在算的东西放寄存器;马上可能再用的放 Cache;运行中的大量内容放主存;长期保存的内容放外存。
四层的作用:
| 层次 | 主要作用 | 本章典型实现 |
|---|---|---|
| 寄存器 | CPU 直接运算、暂存地址与结果 | 触发器等高速电路 |
| Cache | 保存常用主存数据的副本 | SRAM |
| 主存 | 保存运行中的程序和数据 | DRAM |
| 外存 | 长期保存程序、文件等 | HDD、SSD 等 |
主存和外存,并不是根据“在机箱里面还是外面”简单划分
机箱里的 SSD 仍属于外部辅助存储器。这里的“外存”,强调的是它相对于主存的角色。
讲义还区分:
- **联机外存:**通常连接在系统中,如内部硬盘。
- **脱机或可移除介质:**如移动硬盘、光盘、存储卡等。
你要会写的简答题答案是:
分层存储用少量高速、昂贵的存储器配合大量低速、便宜的存储器,在成本可接受的条件下兼顾容量与访问速度。
3.1.3 的外存接口,是在回答“存储设备如何接入计算机”
介质负责保存信息,接口规定如何交换命令、地址和数据。二者要分开。
| 接口 | 需要记住的特点 |
|---|---|
| IDE / ATA / PATA | 传统并行硬盘接口;PATA 强调并行 |
| SCSI | 可管理多种外设,讲义强调工作站、服务器用途 |
| SATA | Serial ATA,串行传输 |
| SAS | Serial Attached SCSI;常见 SAS 控制器可接 SATA 盘,普通 SATA 控制器不能接 SAS 盘 |
| SD | 可移除存储卡接口;卡内含 Flash 和控制器 |
| eMMC | 把 NAND Flash 和控制器整合起来的嵌入式存储方案 |
| UFS | 集成控制器的闪存方案,采用串行接口和 SCSI 命令模型 |
Mini SD、Micro SD/TF 是不同尺寸形式;Micro SD 可通过适配器装入相应 SD 卡槽。
**为什么要讲接口?**章末 3.6 直接问接口标准,而且后面嵌入式系统接 Flash 时,是否需要控制器就是关键区别。
讲义列出了 IDE、SATA、SAS 各代速率,以及 SD、eMMC、UFS 的历史版本参数。它们用于展示接口演进。先掌握“并行还是串行、连接什么设备、有没有控制器”,具体年代、线缆长度、版本速率属于查表层面的知识。
3.1.4 的性能指标,不能只看容量
需要会解释:
- **容量:**能保存多少信息。
- **存取时间 :**一次操作从启动到完成用了多久。
- **存取周期 :**连续启动两次独立操作,至少要间隔多久。
- **带宽:**单位时间能传输多少信息。
- 还有可靠性、功耗、价格、供电电压与接口兼容性等。
存取时间与存取周期不是同一个东西
一个操作已经完成,器件可能还要恢复状态,才能开始下一次。因此教材通常有:
本章的简单带宽模型:
这里 是每次传输的位数。
若一次传 32 位,周期 100ns:
即 320Mb/s,或 40MB/s。
**学到什么程度?**会算容量、单位换算、带宽;能解释“速度快”可能指延迟短,也可能指吞吐量大。
第三章 · 第 03 节
3.2 ROM:怎样保存、编程与擦除
掌握要求:比较五类 ROM,解释浮栅电荷、擦除粒度、NOR/NAND 及 XIP。
背景为什么要讲:SIMOS、FLOTOX、2764A、2816 是器件原理和读手册的实例;不用背所有编程电压与脉冲宽度。
ROM 的历史名称是只读存储器。后来很多 ROM 家族器件可以编程甚至反复改写,但它们仍保留这个名称。
这道题不能只回答“ROM 只能读”。要回答:
这些器件属于历史上的 ROM 家族,具有非易失性;部分器件可以在专门的编程或擦除条件下改写,读写特性与普通 RAM 不同。
先把五种器件放在一张表里
| 类型 | 内容如何写入 | 能否重新改写 | 最重要的区别 |
|---|---|---|---|
| 掩模 ROM | 制造时固化 | 用户不能改 | 出厂内容固定 |
| PROM | 用户编程一次 | 通常不能恢复后重写 | 熔丝或反熔丝发生永久变化 |
| EPROM | 电编程 | 可以,先紫外线擦除 | 通常整片擦除 |
| EEPROM | 电擦除、电编程 | 可以 | 可支持较细粒度,典型是字节 |
| Flash | 电编程、电擦除 | 可以 | 高密度,通常按块擦除 |
掩模 ROM:制造时就把内容定好了
内部主要有三个部分:
- **存储矩阵:**保存各个比特。
- **地址译码器:**把地址转换成选择某个单元的信号。
- **输出缓冲器:**把数据送出去,并控制是否连接到总线。
讲义的 ROM 示例是:
四个地址,每个地址对应四位数据。
需要两位地址,因为:
地址译码器产生四条字选择线,每次选择一个四位单元。
讲义示例内容是:
- 地址
00:1010 - 地址
01:1011 - 地址
10:1110 - 地址
11:0001
这里要学的是**“地址选择一组比特”**,不必背这四组数据。
输出缓冲器还有一个重要状态:高阻态。
高阻态可以理解成:
这个芯片暂时退出总线,不主动输出 0,也不主动输出 1。
后面多片存储器共用数据总线时,全靠它避免相互冲突。
PROM:用不可逆的物理变化写入
熔丝型 PROM 用较大电流把某些连接烧断;反熔丝型则把原本绝缘的连接永久击穿。
记住:
熔丝是“原来接通,编程后断开”;反熔丝是“原来断开,编程后接通”。
具体“断开代表 0 还是 1”取决于读出电路,不能脱离器件结构死记。
为什么只能一次编程?因为这些变化通常不可恢复。
EPROM、EEPROM、Flash 的共同基础,是把电荷留在绝缘结构中,用它改变器件的电学状态
下面的图可以切换到“浮栅存储”。
图中浮栅被绝缘层包围,电子难以直接逃走,因此断电后仍能保持状态。
这里真正需要理解的因果关系是:
对本章讨论的典型 N 沟道浮栅器件,注入负电荷会提高阈值,使它在相同读电压下更难导通。Micron 的存储器教学资料也用这个关系解释读取。
**讲义这里有笔误和前后不一致。**第 11 页对电荷状态与逻辑值的叙述相互冲突,第 17 页关于电荷与导通的部分叙述也需要纠正。先掌握上面的物理关系;具体读成 0 还是 1,要看读出电路和器件规定。
常见 EPROM 在擦除后各位为 1,即字节为 FFH,再通过编程把选定位变成 0;讲义第 11 页的“擦除后读出 00”不应作为通用结论。ST 的 M27C64A 原厂数据手册明确说明其擦除态为全 1。
EPROM:电写入,紫外线擦除
讲义使用 SIMOS,也就是叠栅注入 MOS 结构来解释它:
- 控制栅用于施加控制电压;
- 浮栅用于保持电荷;
- 编程时用较强电场将电荷注入;
- 紫外线使存储电荷得到释放,恢复擦除状态。
因此传统 UV EPROM 封装有石英窗口,编程后需要遮光保护。
它的主要缺点:
即使只想改一小部分,通常也要把芯片取下,整片擦除后重新编程。
**讲义为什么花很多篇幅讲 2764A?**它用一个具体器件教你阅读引脚、工作方式表和编程时序。
2764A 是:
所以有 13 位地址和 8 位数据。
需要认识的信号:
| 信号 | 作用 |
|---|---|
| CE# / CS# | 芯片使能、片选 |
| OE# | 输出允许 |
| PGM# | 编程控制 |
| VCC | 正常供电 |
| VPP | 编程所需的电压输入 |
# 表示低电平有效。引脚名上画横线,也常表示这个意思。
讲义列出的工作方式包括:读、输出禁止、备用、编程、校验、编程禁止、读标识符。
你应该知道它们各自解决什么问题:
- 读:取出内容。
- 输出禁止:停止驱动数据总线。
- 备用:降低功耗。
- 编程:写入内容。
- 校验:读回来,检查是否写对。
- 编程禁止:避免未选中器件被误写。
- 读标识符:识别厂商和器件。
快速编程流程的核心思想则是:
用较短编程脉冲尝试写入,随后校验;必要时继续编程并再次校验。
**学习要求:会看表、会解释流程。**具体厂商编码、某个引脚的编程电压、某种算法的脉冲宽度属于型号参数,不能把不同器件或算法的数据混用。
EEPROM:改成用电擦除
讲义用 FLOTOX 管解释 EEPROM:
在很薄的氧化层区域形成足够强的电场,使电子通过隧穿过程进出浮栅。
因此擦除不再需要紫外线灯,也可以在系统内进行。
本章典型 EEPROM 单元还增加了选通管,以提高选择性和擦写可靠性。薄氧化层的厚度、面积、耐压之所以要控制,是因为它既要允许受控隧穿,又要长期可靠地保持电荷。
2816 是讲义的器件例子:
需要认识它的特点:
- 数据引脚可用于输入与输出;
- 可按字节擦写;
- 也可整片擦除;
- 读、擦写、备用等工作方式由控制信号和编程条件决定;
- 擦写速度比读取慢很多。
讲义给出的读取、擦写时间和电压,是这个历史器件的例子。真正要会解释的是:EEPROM 可改写,但并不因此等同于可高速频繁写入的 RAM。
Flash:通过更紧凑的单元结构提高密度
本章典型 Flash 电路减少了单元中的器件数量,又使用电擦除,适合较大容量存储。
其代价之一是:
擦除通常按块进行,不能把任意一个字节都当成 RAM 那样随意覆盖。
对典型 Flash,可以先这样记:
- 擦除:把一个擦除块恢复为擦除态。
- 编程:把选定位从擦除态改成编程态。
- 已编程的位要恢复擦除态,通常需要擦除所在块。
擦写会损耗器件,所以寿命有限。讲义中的擦写次数用于展示这个限制,具体寿命应看器件,不存在适用于所有 Flash 的固定次数。
NOR 与 NAND,必须分清
| 比较项目 | NOR Flash | NAND Flash |
|---|---|---|
| 读取方式 | 适合按地址随机读取 | 主要按页组织读取 |
| 编程方式 | 可支持字节或字编程,依器件而定 | 通常按页编程 |
| 擦除方式 | 按块或整片 | 按块 |
| 典型用途 | 程序、启动代码 | 大容量数据、文件 |
| 直接执行代码 | 可支持 XIP | 原始 NAND 通常需先搬到可执行存储器 |
| 管理问题 | 接口较接近普通存储器 | 常需处理 ECC、坏块等 |
| 容量和成本取向 | 适合代码存储等用途 | 强调高密度、低位成本 |
XIP 的意思是 Execute In Place,原地执行:CPU 可以直接从相应的 NOR 存储地址取指令,不必先把整段代码复制到 RAM。
**这一节的达标标准:**看到一种 ROM,能回答“能不能改、怎么擦除、擦除多大一片、适合存什么”。
第三章 · 第 04 节
3.3 SRAM 与 DRAM
掌握要求:解释保持、刷新、读出还原,算地址复用与校验位容量,并会看控制信号表。
背景为什么要讲:历史芯片提供具体组织例子;从 N×M 和手册算参数,比背型号更重要。
3.2 的存储单元图也可以切到 SRAM 和 DRAM;下面补充行列地址复用的步骤。
SRAM:用双稳态电路保持一位
典型六管 SRAM:
- 四个晶体管形成交叉耦合的保持电路;
- 两个访问晶体管负责把内部节点接到位线上。
两个互补节点可以稳定在:
或者:
只要持续供电,反馈电路就能维持状态。
因此:
SRAM 不需要刷新,但仍是易失性的。
“静态”说的是不需要定时刷新,绝不是断电不丢失。
DRAM:一个晶体管加一个电容,保存一位
电容保存的电荷会泄漏,因此需要刷新。
你可以理解成:
先识别原来保存的是 0 还是 1,再恢复对应的电荷状态。
刷新不是把所有位都写成 1
DRAM 读取也会扰动电容中的电荷,所以读出后需要还原。刷新通常按行进行,刷新该行的多个存储位,而不必把这些数据输出到 CPU 的数据总线上。
讲义里的“2ms 内刷新一遍”是所讨论器件的参数,不是所有 DRAM 的统一要求。
| 比较项目 | SRAM | DRAM |
|---|---|---|
| 保持方式 | 双稳态反馈电路 | 电容电荷 |
| 是否刷新 | 不需要 | 需要 |
| 断电是否保持 | 本章普通器件不能 | 不能 |
| 单元结构 | 较复杂 | 较简单 |
| 集成密度 | 相对低 | 相对高 |
| 每位成本 | 相对高 | 相对低 |
| 典型用途 | Cache、小容量快速存储 | 大容量主存 |
这张比较表是必会解释的内容。
SRAM 芯片示例,是在教你怎样读组织方式和控制信号
讲义中的 6116:
因此有 11 位地址。内部可以把这 11 位分给行、列译码器,选中一个八位单元。
采用行列结构,是为了便于组织大型矩阵,并不会改变 个单元这个事实。
对本章的 SRAM 控制方式,可以这样记:
| 操作 | CS# | OE# | WE# | 数据由谁驱动 |
|---|---|---|---|---|
| 读 | 0 | 0 | 1 | 存储芯片 |
| 写,采用讲义中的控制组合 | 0 | 1 | 0 | CPU 或总线主设备 |
| 未选中 | 1 | × | × | 芯片输出高阻 |
其中 × 表示这个条件下不关心该信号。
其他例子如 6264、62256 等,主要是容量和引脚配置不同。6264 的备用电源保护电路值得认识:
用电池继续供电,可以保持 SRAM 内容;这并没有让 SRAM 单元本身变成非易失性器件。
DRAM 的地址复用,必须理解
讲义的 2164A:
选择 64K 个位置需要 16 位地址。
但它可以把地址分两次传入:
- 先用 8 个引脚传入行地址,由 RAS# 锁存。
- 再用同样的 8 个引脚传入列地址,由 CAS# 锁存。
所以:
只有 8 根外部地址引脚,也能接收合计 16 位的地址信息。
因此不能看到 8 根地址引脚,就直接判断容量是 。
这颗芯片每个单元只有一位,所以八颗同时工作,才能组成:
讲义的 DRAM 存储条示例,还包含校验位
两个 芯片提供八位数据;一个 芯片提供一位奇偶校验:
其中:
- 8 位是用户数据;
- 1 位是校验信息。
因此用户数据容量是 256KB,不能把校验位都算成可用数据容量。
为什么要讲这个?它把位扩展和可靠性开销联系起来了。
第三章 · 第 05 节
3.4.1—3.4.2 CPU 连接与存储扩展
掌握要求:会做 3.22—3.27:容量、地址译码、芯片数量、数据位分配和地址范围。
背景为什么要讲:必须把字地址和 CPU 字节地址分开。图中的组织图不代替器件电气时序和控制器设计。
先把三类总线记牢:
| 总线 | 回答的问题 | 基本作用 |
|---|---|---|
| 地址总线 AB | 访问哪个位置? | 传地址 |
| 数据总线 DB | 传什么内容? | 传数据 |
| 控制总线 CB | 读还是写、谁工作? | 传控制信号 |
地址线数决定可选择多少位置;数据线数决定一次能传多少位
两个量不能混为一谈。
直接做章末 3.22
题目说:
按字节编址,40 位地址线,16 位数据线,问容量。
按字节编址,每个地址对应一字节:
16 位数据总线说明一次传输可以传两字节,不会把地址空间再乘以 2。
还有一个措辞要准确:这是最大可寻址容量,题目并没有证明机器实际安装了这么多内存。
低位地址选择片内位置,高位地址决定哪片芯片工作
讲义的例子:
- CPU 有 20 位地址;
- 芯片是 ;
- 256K 等于 ,芯片需要 18 位地址。
于是:
A0~A17:选择芯片内部的位置。A18、A19:决定芯片放在 CPU 地址空间的哪个区域。
| A19 A18 | 对应地址范围 |
|---|---|
| 00 | 00000H~3FFFFH |
| 01 | 40000H~7FFFFH |
| 10 | 80000H~BFFFFH |
| 11 | C0000H~FFFFFH |
例如把芯片安排在第二个区域,就要求:
时片选有效。
地址范围的结束地址:
最后的减 1 不能漏,因为起始地址本身已经算第一个位置。
扩展分成三种:位扩展、字扩展、复合扩展
把芯片看成“行数 × 每行宽度”的表,最容易理解:
- 位扩展:行数不变,让每行更宽。
- 字扩展:每行宽度不变,让行数更多。
- 复合扩展:两者都增加。
位扩展:同一个地址,多颗芯片一起提供不同的数据位
例如:
需要两颗:
- 第一颗接
D0~D7。 - 第二颗接
D8~D15。 - 两颗地址线并联。
- 两颗同时选中。
- 两颗的读写控制同步。
原因很直接:
一颗只能给八位,两颗同时给出数据,拼成十六位。
字扩展:让不同芯片负责不同地址范围
例如:
需要四颗:
- 各颗低 16 位地址线并联。
- 数据线都连接
D0~D7。 - 高两位地址经过 2-4 译码器,产生四个片选。
- 每次只选中一颗,其他芯片输出高阻。
为什么数据线可以并在一起?因为每次只有一颗负责输出。
为什么不能四颗同时选中?因为它们可能在同一根数据线上输出不同电平,产生总线冲突。
复合扩展:先拼出足够宽的一组,再增加组数
章末 3.27:
先两颗拼成:
再用两组实现:
图中使用的是以 16 位存储字为单位的地址编号:
- 低 12 位字地址:选每组内部的 4K 个位置。
- 高一位字地址:选第 0 组还是第 1 组。
- 同一组的两颗芯片同时工作,各负责八位。
- 不同组互斥选中。
计算芯片数的通用方法:
目标为 ,单颗为 ,若各项整除:
做题时把“每组几颗”和“共几组”分别写出来,连接关系就容易确定了。
把 3.23~3.27 全部做掉
| 题号 | 目标 | 所需芯片与组织 | 关键连接 |
|---|---|---|---|
| 3.23 | 8 颗,位扩展 | 地址 A0~A19 并联,各颗分别负责 D0~D7 的一位;同时片选 | |
| 3.24 | 2 颗,位扩展 | 地址并联;一颗负责低八位,一颗负责高八位 | |
| 3.25 | 4 颗,字扩展 | A0~A15 并联;A16、A17 经 2-4 译码选择芯片 | |
| 3.26 | 8 颗,字扩展 | A0~A9 并联;A10~A12 经 3-8 译码选择芯片 | |
| 3.27 | 四颗 | 2 组,每组 2 颗 | 组内位扩展,组间字扩展 |
3.25 若从地址 0 开始:
| 芯片 | 地址范围 |
|---|---|
| 第 0 片 | 00000H~0FFFFH |
| 第 1 片 | 10000H~1FFFFH |
| 第 2 片 | 20000H~2FFFFH |
| 第 3 片 | 30000H~3FFFFH |
3.26 每颗占 1K,即 400H 个字节地址。第 颗的范围为:
所以第一颗是 0000H~03FFH,最后一颗是 1C00H~1FFFH。
还有一个实际接线时非常重要的细节:字地址和 CPU 字节地址可能错开一位
例如 :
- 有 4K 个十六位字;
- 共 8KB;
- 芯片的一个地址选择两字节。
若 CPU 按字节编址,那么相邻两个字的 CPU 地址差 2。
因此,常见十六位连接中:
以此类推。CPU 的 A0 用于区分字中的字节位置,并配合字节使能或屏蔽信号。
因此,上面 3.27 图中的字地址 A12,若换成 CPU 字节地址,通常对应 CPU 的 A13。
这也是讲义 NOR Flash 接口图把 CPU 的 A[20:1] 接到芯片 A[19:0] 的原因。
做芯片组织题可以先使用存储字地址;题目明确 CPU 按字节编址并要求实际接线时,必须处理这层对应关系。
把五种扩展方案逐个画出来
先按存储字编号做组织题,确定同组芯片的数据位分工,再检查哪组被选中。下面可以切换全部五道扩展题;地址改到下一组时,观察片选变化。
第三章 · 第 06 节
3.4.3 嵌入式系统的存储扩展
掌握要求:会说明 NOR、NAND、SRAM/SDRAM 怎样连接,控制器需要配置什么。
背景为什么要讲:具体 SoC 的启动地址和引脚不是所有 ARM 芯片通用的规则;本章先理解流程。
这部分对应 3.28、3.29,不能略过。
先理解嵌入式系统中的常见分工:
- NOR Flash:保存程序、启动代码。
- SRAM:保存变量、栈等运行数据。
- NAND Flash:保存大容量程序文件、数据。
- SDRAM:提供较大容量的运行空间。
具体系统采用什么组合,取决于芯片和需求。
NOR Flash:比较像普通可寻址存储器
本章示例 HY29LV160,在十六位模式下:
它有独立地址线、数据线和片选、读写控制信号。
还需要认识:
BYTE#:选择相应字节模式。RESET#:复位。RY/BY#:指示就绪或忙。DQ15/A[-1]:在不同模式下可以承担数据位或额外地址位的功能。
为什么有这些复用?因为同一颗器件可以采用不同数据宽度组织。
在讲义的 S3C2440 NOR 启动示例中,NOR 映射到启动地址区域,CPU 可以直接取启动指令。这里的启动地址和配置属于这个具体 SoC 示例,不能推广成所有 ARM 芯片都一样。
NAND Flash:经控制器传命令、地址,再传数据
原始 NAND 常把命令、地址、数据分时放到同一组 I/O 引脚上。
需要认识的信号:
| 信号 | 作用 |
|---|---|
| CLE | 命令锁存使能 |
| ALE | 地址锁存使能 |
| CE# | 片选 |
| WE# | 写使能 |
| RE# | 读使能 |
| WP# | 写保护 |
| R/B# | 就绪/忙 |
概念上的访问流程:
- 发送操作命令。
- 发送相应地址。
- 等待器件完成内部操作。
- 读取或写入数据。
- 检查状态、校验等。
控制器负责把 CPU 总线访问转换成 NAND 所需的接口动作。
**地址、数据复用,不等于每次只传一位。**本章示例使用八位 I/O 总线,命令、地址、数据在不同阶段占用这八根线。
讲义 K9F2808U0A 的每页组织为:
附加区域可用于校验、状态等管理信息。它不是普通用户数据容量的一部分。
因此 NAND 存储的工程管理不仅是“把位写进去”,还包括坏块和纠错等问题。eMMC 把 NAND 与控制器整合起来,正是为了把这些管理工作封装起来。
SDRAM:不仅要接线,还要配置控制器
本章 SDRAM 例子:
容量:
要把“每 Bank 单元数”“每单元位数”“Bank 数”分别乘进去。
典型信号:
- 地址线、数据线;
BA0、BA1:选择 Bank;CLK、CKE:时钟及其使能;CS#、RAS#、CAS#、WE#:命令与控制;LDQM、UDQM:低、高字节屏蔽。
多 Bank 的意义,是提供交错安排操作的机会,减少一部分等待。
刷新和预充电要分开
- 刷新:恢复存储电荷,保持数据。
- 预充电:关闭或准备行相关电路,为后续操作做准备。
讲义将二者放在一起叙述,容易让人误以为它们是同一个操作。实际分析时应分别看待。
完成连接后,还要设置总线宽度、时序、刷新参数、模式等,否则 SDRAM 不会因为“线接上了”就自动正常运行。
3.29“ARM 微处理器如何扩展 RAM”,可以这样回答:
根据具体 ARM SoC 提供的外部存储控制器,选用 SRAM、SDRAM 等器件;确定容量、数据位宽、地址组织和片选关系,连接地址、数据、控制及时钟信号;再设置控制器的时序、地址映射和刷新等参数。必要时使用多颗芯片进行位扩展或字扩展。
这里“ARM”描述处理器体系,具体可接什么 RAM,需要看 SoC 的存储控制器。
第三章 · 第 07 节
3.4.4 内存条、SDRAM 与 DDR
掌握要求:会解释模块化、SPD、预取和双边沿传输,能按速率与位宽算带宽。
背景为什么要讲:DIP、TSOP、BGA、SIPP、SIMM、DIMM 都说明用途;不要求背完封装针数和历代产品参数。
为什么采用内存条?
把多颗存储芯片组织成可插拔模块,便于生产、安装、维修和升级,也形成标准接口。
一根内存条主要包括:
| 部件 | 作用 |
|---|---|
| DRAM 颗粒 | 真正保存主存数据 |
| PCB | 安装器件并连接信号 |
| SPD 芯片 | 记录容量、时序、电压等参数 |
| 金手指 | 连接主板插槽 |
| 阻容元件 | 改善供电和信号完整性等 |
SPD 是小型非易失性器件,讲义用 EEPROM 解释。启动时读取 SPD,帮助系统配置内存。
SPD 保存的是内存条参数,不是给用户存程序的大容量主存
讲义还列出封装和模块形式:
- DIP:双列直插封装。
- TSOP:薄型小外形封装。
- BGA:球栅阵列封装。
- SIPP:单排插针形式。
- SIMM:模块两面的对应触点传相同信号。
- DIMM:模块两面的触点可独立传输信号。
为什么要讲这些?它们说明器件怎样从芯片变成可安装的模块。简答题中要会说明模块化的意义;封装外观和具体引脚数量,通常属于识别、查表层面。
异步 DRAM → FPM → EDO → SDRAM → DDR,是围绕减少等待、增加传输机会演进的
- 普通异步 DRAM:一次访问需要行、列选择等过程。
- **FPM:**保持同一行打开,连续访问不同列,省掉重复打开同一行的开销。
- **EDO:**延长数据输出有效时间,使部分操作可以重叠。
- **SDRAM:**按时钟组织命令和操作,便于流水线、突发与多 Bank 调度。
- **DDR:**在时钟两个边沿传数据。
讲义第 33 页对 FPM 的行、列叙述写反了。正确抓法是:
同一行,多次访问不同列。
Micron 的原厂 FPM 数据手册也按“保持 RAS,重复给出列地址”的方式描述。Micron Memory Data Book
SDR 与 DDR 的区别,看下面这张图
- SDR:每个时钟周期一次数据传输机会。
- DDR:上升沿和下降沿都有数据传输机会。
因此在相同外部时钟频率下,DDR 的传输次数是 SDR 的两倍。
从 DDR 到 DDR4,必会解释的变化:
| 类型 | 预取深度 | 典型标准电压 | 主要改进 |
|---|---|---|---|
| DDR | 2n | 2.5V | 双边沿传输 |
| DDR2 | 4n | 1.8V | 更深预取、信号完整性改进 |
| DDR3 | 8n | 1.5V | 更深预取、更低电压及控制改进 |
| DDR4 | 8n | 1.2V | Bank Group、更高数据速率与密度 |
预取可以先理解为:
内部一次准备更多数据,再按外部接口节奏连续送出去。
**DDR4 的预取深度仍是 8n,不是继续变成 16n。**它通过 Bank Group 等设计提高操作安排与传输效率。
讲义所说的 ODT,是片内终端匹配一类技术,用于改善高速信号质量;OCD、ZQ 校准、复位、自刷新相关技术等,也是围绕驱动匹配、可靠性和功耗做改进。认识目的即可,做本章简答题无需展开电路细节。
**讲义 DDR4 的“284 个针脚”有误。**常见桌面 DDR4 DIMM 为 288 针,DDR3 DIMM 为 240 针;对应笔记本模块又有不同针数。Kingston 的 DDR4 技术介绍
讲义还提到 DDR5:
- 更低的标准工作电压;
- 更高的数据传输能力;
- 一个模块中采用两个独立子通道;
- 增加可靠性相关机制。
这里先认识演进方向。芯片内部纠错与整条内存提供的系统级 ECC,也应区分,不能看到“ECC”就认为两者完全相同。
带宽题用这一条公式最稳:
例如 64 位数据宽度,400MT/s:
MT/s 表示每秒传输次数。不要把它直接当成内部存储单元的时钟频率。
双通道在理想情况下,把两条独立的通道并行使用,总带宽可以相加。
特别注意:DDR2-400 与 DDR-400 的外部数据速率同为 400MT/s时,单通道同位宽的理论带宽相同。“代际带宽翻倍”需要说明比较的频率条件,不能只看名字。
第三章 · 第 08 节
3.5.1 Cache 的原理与性能
掌握要求:理解局部性、命中、管理位和容量口径;会算命中率与简化平均访问时间。
背景为什么要讲:特定 CPU 的 Cache 容量与路数是案例;要理解取舍,不能背成普遍常数。
Cache 是主存中一部分数据的高速副本。
CPU 请求数据时:
- 已在 Cache 中:命中。
- 不在 Cache 中:未命中,也叫脱靶;需要进一步访问主存。
它主要解决:
CPU 很快,主存相对慢,CPU 经常等数据。
Cache 有效的基础,是局部性
时间局部性:
刚用过的东西,很可能很快再用。
例如循环里不断更新同一个变量。
空间局部性:
刚访问一个位置,很可能很快访问相邻位置。
例如顺序读取数组。
因此,CPU 即使只请求一个字节,Cache 也常把这个字节所在的整块调入。
这就是 Cache line 的数据块。
Cache line 除了数据,还必须知道“数据来自哪里、能不能使用”
| 字段 | 回答的问题 |
|---|---|
| 数据 | 保存的内容是什么? |
| Tag | 这行对应主存的哪个块? |
| Valid,有效位 | 这行当前是否保存有效内容? |
| Dirty,脏位 | 内容是否修改过,但尚未写回下一级? |
| 替换状态 | 需要淘汰时,哪些行更适合淘汰? |
其中数据、Tag、有效位是基本信息。脏位、替换信息取决于设计和策略。
讲义例子:
32 行需要:
但它的数据容量只有:
其余是管理开销。
**题目说“Cache 容量 16KB”时,本章映射题指的是数据区容量。**若问总硬件存储开销,还要加 Tag 和控制位。
多级 Cache 的思路也一样
讲义介绍:
- L1 可分指令 Cache 和数据 Cache,减少两类访问争用。
- L2 通常容量更大。
- L3 在讲义的典型多核结构中由多个核心共享。
具体某代 CPU 的容量、路数只是案例。你需要理解层次与分工,不需要背本章所有型号参数。
命中率:命中次数除以总请求次数
80 次命中,20 次未命中:
分母不是“Cache 查询次数 + 命中次数”。每个请求先查 Cache,不代表每次都命中。
补充一个常见性能题公式
如果每次先花 查 Cache,未命中后再多花 处理:
例如:
- Cache 查询 2ns;
- 命中率 95%;
- 未命中额外花 80ns。
则:
为什么这里要补充?它把“命中率高所以快”变成可计算的关系,也能防止把未命中额外时间和未命中总时间混用。
影响 Cache 性能的因素,要理解方向,不能机械背“越大越好”
- 容量太小:常用内容装不下。
- 映射限制太强:不同主存块争同一个位置。
- 块太小:较难充分利用空间局部性。
- 块太大:装入代价增加,同容量下行数减少,还可能带入大量用不到的数据。
- 替换策略不合适:把马上要用的块淘汰了。
- 多级结构、指令数据分离、预取:可改善部分访问行为。
更标准的未命中分类是:
- **首次或强制未命中:**第一次访问,还没装入。
- **容量未命中:**Cache 放不下需要的工作内容。
- **冲突未命中:**位置限制造成相互挤出。
讲义给出的特定命中率、容量比例属于例子,不是所有机器都满足的规律。
第三章 · 第 09 节
3.5.2 三种映射与地址字段
掌握要求:由主存地址求块号、偏移、组号和 Tag,分清 Tag 位数、数值与路号。
背景为什么要讲:映射公式必须会用;相联查找的电路思想要理解,暂不要求设计比较器网络。
先统一符号:
- :主存字节地址;
- :每块字节数;
- :Cache 数据容量;
- :Cache 总行数;
- :每组路数;
- :组数。
先拆主存地址:
这一步对三种映射都适用。
块号告诉你“在哪一块”,偏移告诉你“在这一块的哪个字节”
下面的图可切换映射方式,也可以修改地址。
直接映射:一个主存块,只有一个候选 Cache 行
为什么还需要 Tag?
因为不同主存块可能得到同一个行号。
例如 Cache 有 256 行:
- 主存块 128 → 行 128;
- 主存块 384 → 也到行 128。
因此只知道“第 128 行”还不能知道里面是谁,必须比较 Tag。
命中的条件:
直接映射优点是简单;缺点是两个常用块可能不断争同一个位置。
全相联:一个主存块,可以放到任何 Cache 行
没有固定的行索引,需要在候选行中比较 Tag。
优点:放置自由,减少固定位置冲突。
代价:需要更多比较和替换管理电路,尤其容量或相联度很大时。
讲义的“块表”,是表达主存块与 Cache 行关系的逻辑模型。实际可通过每行的 Tag 和比较电路完成查找,并不一定真的存在一张供 CPU 软件读取的普通表。
相联存储器的意思是:
根据内容是否匹配进行查找,而不只是给一个地址取出某个位置。
组相联:先固定组,再允许放在组内任意一路
例如 8 路组相联:
每组有 8 个候选位置。地址决定哪一组;具体在哪一路,由查找结果或装入位置决定。
主存地址中没有一个字段直接指定“组内第几路”。
你一定要记住这句话。它是很多组相联题的关键。
三种映射其实可以统一:
- 1 路组相联,就是直接映射。
- 只有一组、所有行都在这一组,就是全相联。
- 中间情况,就是通常的组相联。
地址字段位数:先算低位,再算中间,剩下给 Tag
假设容量、块大小、组数都为 2 的整数次幂:
直接映射时 。
全相联时 ,索引为 0 位。
讲义在 Cache 一节使用了“页号”这个词,表示一种地址分区。它不是下一节操作系统分页中的虚拟页,也不需要去查虚拟存储器页表。
讲义组相联部分有些“页”的数量描述不一致,做题时用上面“总行数÷路数求组数”的方法最稳。
第三章 · 第 10 节
习题 3.20、3.21 完整演算
掌握要求:能独立算直接映射和八路组相联,并解释结果为什么不同。
背景为什么要讲:这两题是全章计算核心之一;数字相同的现象必须检查原因,不能推广成通则。
两题共同条件:
- 主存 1MB;
- Cache 16KB;
- 块大小 64B;
- 按字节编址。
先统一换成 2 的幂:
所以:
- 主存地址 20 位。
- 块内偏移 6 位。
- Cache 总行数:
3.20:直接映射
第一问:
地址格式:
为什么 Tag 六位?
题给地址:
先分块:
因此:
- 主存块号:128;
- 块内偏移:33,即
21H。
Cache 行号:
Tag:
第三问答案:
第二问 Cache 数据区地址:
所以:
这次 Cache 地址恰好与主存地址的数值相同,是这个地址和映射条件导致的。不是通用规律。
可以用 06021H 检查理解:
- 主存块号 384;
- 仍映射到 Cache 行 128;
- Tag 变成 1;
- Cache 数据区中的位置仍是
2021H。
位置相同,Tag 不同;两块不能同时占据这个直接映射行。
3.21:8 路组相联
总行数仍是 256,但组数为:
因此:
- :块内偏移,6 位。
- :组索引,5 位。
- :Tag,剩余 9 位。
第一问:
还是地址 02021H,主存块号还是 128。
组号:
第二问:
Tag:
第三问问的是 Tag 占多少位:
注意区分:
Tag 位数是 9,当前地址的 Tag 数值是 4。
**组内哪一路无法单凭这个地址确定。**它可能在第 0 组的任意一路,取决于已有内容和装入策略。
第三章 · 第 11 节
3.5.3 Cache 读取、更新与替换
掌握要求:区分串行/并行请求路径、写通/写回和写分配,并能按序列模拟替换。
背景为什么要讲:多核与 DMA 的一致性机制还有更深内容;这里先掌握最新数据、Dirty 与替换的关系。
这三个问题要分别处理。
读取结构有两种
贯穿读出 Look Through:
先查 Cache,未命中再把请求送往主存。
优点:命中时可以避免主存访问。
代价:未命中访问要经过前面的 Cache 查询。
旁路读出 Look Aside:
同时向 Cache 和主存发出请求;若 Cache 命中,使用 Cache 返回的数据并抑制相应主存请求。
优点:减少串行等待。
代价:主存侧请求与总线活动更多。
这里掌握请求路径和取舍即可,不必死记固定延迟数值。
写入策略:写通与写回
假设主存中 x=3,CPU 要改成 x=5。
写通 Write Through:
更新 Cache 时,也把写入送往主存。
优点:更新关系简单。
代价:主存写流量较大。实际可用写缓冲减少 CPU 等待,所以不必把它理解成每次都完全停下来等待主存。
写回 Write Back:
先只改 Cache,并设置 Dirty;需要把这个脏块淘汰或执行相应回写操作时,再写回主存。
因此可能暂时出现:
- Cache:
x=5 - 主存:
x=3 - Dirty:1
写回允许这种受管理的暂时差异。所谓一致性,是保证系统能获得正确的新数据,而不是要求每一时刻两个物理位置都完全相等。
讲义关于写回的表述容易让人误读成“再次修改就写回”。正确抓法是:
可以在 Cache 中反复修改;脏块被替换出去之前,要按策略写回。
如果把脏块直接丢弃,最新修改就会丢失。
**为什么需要保证正确更新?**否则 CPU、其他访问者或后续主存读取可能读到过期内容,程序计算结果就会错。
多核、DMA 等场合还涉及更完整的一致性机制,本章先掌握写通、写回、Dirty 的作用。
写未命中如何处理,是另一个维度
虽然讲义没有展开,你需要认识:
- 写分配:把块装入 Cache 后写。
- 不写分配:绕过 Cache,把写送向下一级。
它们与写通、写回相关,但不是同一个分类问题。提这一嘴,是为了以后看到这些词时不把它们混在一起。
替换策略:只有候选位置满了,才需要选淘汰对象
- 直接映射:目标行固定,没有多个候选行可选。
- 组相联:在目标组内选择。
- 全相联:在整个 Cache 的候选行中选择。
先找无效空位置;没有可用空位置时,再按替换策略选择。
| 策略 | 淘汰依据 | 要会说明的特点 |
|---|---|---|
| Random | 随机选 | 简单,但可能淘汰马上要用的块 |
| FIFO | 最早进入 | 访问命中不改变入队先后 |
| LFU | 统计期内使用次数最少 | 看频率,受统计周期、老数据影响 |
| LRU | 最久没有使用 | 看最近一次访问时间 |
LRU 是“最久没用”,LFU 才是“用得最少”。
讲义第 44 页把 LRU 开头描述成“近期使用次数最少”,这个措辞会把两种算法混淆。LRU 的正确定义是淘汰最后一次访问距今最久的块。MIT 的 Cache 课程说明
讲义中的计数器、队列等内容,是在说明替换信息如何保存:
- LFU:记录访问次数,并约定统计或清零规则。
- FIFO:记录进入顺序。
- LRU:记录最近使用顺序,或使用相应近似机制。
不能背成“LRU 总是命中率最高”,它的效果取决于访问序列;高相联度下精确记录 LRU 也可能比较复杂。
用一个小例子区分 LRU 与 FIFO
两行 Cache,开始为空,访问:
采用 LRU,按“最近使用 → 最久未用”记录:
| 访问 | 结果 | Cache 使用顺序 |
|---|---|---|
| A | 未命中 | A |
| B | 未命中 | B,A |
| A | 命中 | A,B |
| C | 未命中,淘汰 B | C,A |
| A | 命中 | A,C |
关键是第三次访问 A 后,A 变成最近使用,所以装 C 时淘汰 B。
若用 FIFO,A 最早进入,即使命中过,仍会在装 C 时先被淘汰。
这部分的达标标准:会按访问序列一步一步更新状态,而不是只背缩写。
第三章 · 第 12 节
3.6.1 虚拟存储器的用途
掌握要求:区分 VA/PA,说明容量、重定位、地址隔离、保护和共享。
背景为什么要讲:虚拟存储器首先是地址与管理机制;不要把它只记成“硬盘变 RAM”。
程序使用的地址叫虚拟地址 VA。
实际访问物理存储位置所用的地址叫物理地址 PA。
基本关系:
程序看到的连续区域,可以映射到不连续的物理位置。
两个程序也可以使用相同的虚拟地址数字,分别映射到不同的物理位置。
虚拟存储器解决的不只是内存容量问题
本章主要包括:
- 程序不必一次全部装入物理内存。
- 程序不必绑定一个固定物理位置。
- 不同程序可有各自的地址空间。
- 可设置访问权限,实现保护和受控共享。
因此不能把虚拟存储器简单等同于“拿硬盘当 RAM”。
它首先是一种地址空间和存储管理机制;借助外存进行按需调入,是其中一种重要用途。
若当前需要的内容不在主存,可能要从外存调入,代价通常远高于普通内存访问。因此:
虚拟存储器能缓解容量限制,但不能消除物理内存不足带来的性能问题。
频繁调入调出,可能导致严重卡顿,称为抖动的相关现象。
Cache 与虚拟存储器的联系和差别
| 比较 | Cache | 虚拟存储器 |
|---|---|---|
| 主要矛盾 | CPU 与主存的速度差 | 地址管理、保护、主存容量限制 |
| 常见搬运关系 | 主存 → Cache | 外存 → 主存 |
| 信息单位 | Cache line | 页,或本章讨论的段 |
| 主要管理者 | 硬件 | 操作系统与硬件共同配合 |
| 查找关系 | 主存块与 Cache 行 | 虚拟地址与物理地址 |
共同点是:都利用局部性,把较常用的部分放到较快的存储层。
别把本章三种“块”混在一起:
- NAND 页:Flash 内部读写组织。
- Cache line:Cache 与主存之间的数据块。
- 虚拟页:地址空间管理单位。
它们都叫块或页,但所在层次和用途不同。
第三章 · 第 13 节
3.6.2—3.6.4 段、页与段页式转换
掌握要求:会查表、检查范围/权限、计算基址或页框与偏移,并乘表项长度。
背景为什么要讲:三种路径都要认识,详细操作系统页面分配和调度算法在相关课程继续。
下面可以切换三种管理方式。
段式:按程序的逻辑部分划分,段长可以不同
例如:
- 代码段;
- 数据段;
- 栈段。
虚拟地址由:
组成:
- :段号;
- :段内偏移。
段表记录:
- 段基址;
- 段长;
- 是否装入;
- 访问权限等。
转换过程:
- 用段号查段表。
- 检查段是否存在、是否已装入、权限是否允许。
- 检查偏移是否越界。
- 基址加偏移。
若段长为 ,合法偏移通常满足:
例子:
- 段基址
4000H; - 段长
0800H; - 偏移
0100H。
则:
若偏移为 0800H,已经越界,因为最后一个合法偏移是 07FFH。
优点:
与程序逻辑结构对应,便于按段设置保护与共享。
缺点:
段长不固定,容易形成外部碎片;大段搬运代价可能较高。
页式:虚拟空间和物理空间都按同样大小的固定单位划分
- 虚拟空间中的单位:页。
- 物理空间中的单位:页框。
虚拟地址:
- :虚页号。
- :页内偏移。
页表回答:
这个虚拟页,放在物理内存的哪个页框?
若页大小为 字节:
也可以理解成:
将虚页号替换为页框号,低位偏移保持不变。
例子:4KB 页面
所以偏移 12 位。
虚拟地址:
拆成:
- 虚页号 3;
- 偏移
123H。
页表说虚页 3 在物理页框 9,则:
虚页号不要求等于物理页框号;转换前后页内偏移相同。
优点:
- 页框固定大小,分配方便。
- 相邻虚拟页可以映射到不相邻物理页框。
- 避免段式那种可变长分配造成的外部碎片。
代价:
- 最后一页等位置可能有未使用空间,即内部碎片。
- 需要页表。
- 地址转换和缺页处理有开销。
缺页发生时,并不是继续用同一个公式随便找一块内存
如果访问合法,但该页尚未驻留,硬件触发异常,操作系统处理分配或调入,然后重新执行相应访问。
如果地址非法或权限不允许,则是相应访问错误,不能当成普通缺页把数据调入就完事。
段页式:先按逻辑分段,再把每段分页
虚拟地址:
步骤:
- 用段号 查段表。
- 得到这个段的页表位置及相关范围信息。
- 用段内页号 查这个页表。
- 得到物理页框号。
- 拼接页内偏移 ,形成 PA。
一句话记:
段表告诉你查哪张页表,页表告诉你落在哪个物理页框。
它结合了按段组织、保护与共享,以及按固定页面分配物理空间的特点;代价是转换和管理更复杂。
查表地址还要考虑表项大小
如果每项占 字节:
例如页表基址 1000H,每项 4B,虚页号 3:
讲义图中的“基址加段号、页号”是简化示意。做具体字节地址题,不能漏乘表项长度。
第三章 · 第 14 节
TLB、页表开销与页面大小
掌握要求:区分 TLB 未命中和缺页,会算页表容量,能解释大页/小页的权衡。
背景为什么要讲:多级页表要知道稀疏分配思想,不要求现在实现完整页表遍历器。
为什么需要 TLB?因为查页表本身也要访问存储器
在“单级页表、没有相关缓存命中”等简化条件下,一次数据访问可能需要:
- 先读页表项。
- 再读真正的数据。
因此增加访问开销。
TLB 是 Translation Lookaside Buffer,教材叫快表,用来高速保存近期常用的地址转换信息。
TLB 保存映射;普通数据 Cache 保存数据块
必须分清:
- TLB 命中,不等于数据 Cache 命中。
- TLB 未命中,不等于缺页。
TLB 未命中只表示:
当前转换信息不在这个高速缓存里。
接下来查页表,若页本来就在内存,仍能完成访问,不需要从磁盘调页。
页表为什么可能很大?
讲义例子:
- 虚拟地址 32 位;
- 页大小 4KB;
- 每个页表项 4B。
偏移 12 位:
位用作虚页号。
页数:
完整单级页表容量:
所以每个进程维护这样一张完整表,可能有很大开销。
多级页表的意义,是让没有使用的大量地址区域,不必都分配下级页表
一种示意拆分:
先查一级表,再查对应二级表。
这里认识思想即可。它在地址空间稀疏时节省存储;不能理解成无论映射多少地址,都必然比单级表占用更少。
为什么要提?讲义明确提到二级页表,它也解释了操作系统为什么不总使用一张平铺的大表。
章末 3.14:页面大小怎样影响速度?
这是一个权衡题,不能回答“越大越快”或“越小越快”。
页面较大:
- 页数减少,页表项数减少。
- 同样数量的 TLB 项能覆盖更大地址范围。
- 一次缺页搬运更多数据。
- 可能带入更多暂时不用的数据。
- 内部碎片可能增加。
页面较小:
- 单次搬运的数据量较小。
- 分配粒度更细,浪费可能减少。
- 页表项更多。
- TLB 覆盖范围变小。
- 可能发生更多转换和页面管理活动。
可以直接写进简答题的答案:
页面大小会同时影响页表开销、TLB 覆盖范围、缺页搬运代价和内部碎片。大页减少页表项并扩大 TLB 覆盖,但可能增加单次调页代价和无用数据搬运;小页分配更细,但管理与地址转换开销可能增大。需要结合程序局部性和系统特性选择。
讲义中的 4KB 是常见页面大小示例,不是唯一大小。
内容覆盖与学习边界
原书每一小节,都能在这里找到位置
下表按原目录核对。为了先建立解题基础,容量与地址单独放在开头;同一原书小节可以分成多个讲解节。
| 原书位置 | 内容 | 完整讲解 |
|---|---|---|
| 3.1.1 | 存储器的类型 | 第 02 节 → |
| 3.1.2 | 层次化的存储器系统 | 第 02 节 → |
| 3.1.3 | 外存的接口标准 | 第 02 节 → |
| 3.1.4 | 存储器性能指标 | 第 02 节 → |
| 3.2.1—3.2.5 | 掩模 ROM、PROM、EPROM、EEPROM、Flash | 第 03 节 → |
| 3.3.1 | 静态 RAM | 第 04 节 → |
| 3.3.2 | 动态 DRAM | 第 04 节 → |
| 3.4.1—3.4.2 | 地址空间、CPU 连接与扩展 | 第 05 节 → |
| 3.4.3 | 嵌入式系统的存储器扩展 | 第 06 节 → |
| 3.4.4 | 存储器模块 | 第 07 节 → |
| 3.5.1 | Cache 概述 | 第 08 节 → |
| 3.5.2 | 地址映射与转换 | 第 09 节 → |
| 3.5.2 配套题 | 直接映射与八路组相联完整计算 | 第 10 节 → |
| 3.5.3 | Cache 更新与替换 | 第 11 节 → |
| 3.6.1 | 虚拟存储器概述 | 第 12 节 → |
| 3.6.2—3.6.4 | 段式、页式、段页式转换 | 第 13 节 → |
| 3.6.3 延伸 | TLB、页表容量、二级页表与页面大小 | 第 14 节 → |
现在把章末 29 道题与学习内容对上
| 题目 | 你应当掌握的能力 |
|---|---|
| 3.1~3.5 | 按介质、器件、系统角色分类;说明磁、光、半导体存储,以及主存、外存 |
| 3.6 | 列出 IDE/PATA、SCSI、SATA、SAS、SD、eMMC、UFS,并说明基本特点 |
| 3.7 | 说明容量、延迟、周期、带宽、可靠性、功耗、成本、供电等选择因素 |
| 3.8 | 比较 EPROM、EEPROM、Flash,解释可写器件为什么仍属于 ROM 家族 |
| 3.9 | 解释内存条模块化、可安装和可升级的意义 |
| 3.10 | 解释 DDR 到 DDR4 的边沿传输、预取、电压、Bank Group 等改进 |
| 3.11 | 解释速度、容量、成本之间的分层折中 |
| 3.12~3.13 | 解释虚拟存储器的用途,以及 VA 与 PA 的区别和映射关系 |
| 3.14 | 分析页面大小的权衡 |
| 3.15 | 说明段、页、段页三种管理方式,并写出转换步骤 |
| 3.16 | 说明 Cache 的作用、局部性和使用场景 |
| 3.17 | 说明更新正确性的必要性,以及写通、写回 |
| 3.18 | 说明数据、Tag、有效位及相关管理位 |
| 3.19 | 区分 Random、FIFO、LFU、LRU |
| 3.20~3.21 | 本文已完整计算直接映射与 8 路组相联 |
| 3.22 | 本文已计算:按字节编址的 40 位地址空间为 |
| 3.23~3.27 | 本文已给出五种芯片扩展方案及关键连接 |
| 3.28 | 比较 NOR、NAND 的功能、接口、执行代码方式与控制器需求 |
| 3.29 | 说明 ARM SoC 的 RAM 选择、连接、扩展和控制器配置 |
正文中那些看起来很碎的内容,你现在可以这样处理
| 内容 | 为什么讲它 | 需要掌握到什么程度 |
|---|---|---|
| 磁鼓、磁芯、磁泡及发展史 | 说明存储技术与主存角色的演变 | 认识名称和基本意义 |
| 光驱的激光、定位、光电转换部件 | 把“光学状态”与“电数据”联系起来 | 能说出基本读取过程 |
| 外存接口的历史版本、年代和速率 | 展示标准化与性能演进 | 会分类;具体参数查表 |
| SIMOS、FLOTOX 与薄氧化层 | 解释非易失保持、注入、隧穿 | 会讲因果关系,不必推器件物理公式 |
| 2764A、2816 的模式与时序表 | 教你读取器件手册和控制条件 | 会查表、解释读写与校验 |
| 6116、6264、2164A 等型号 | 提供容量、控制、地址复用实例 | 从组织方式算参数,不靠背型号猜 |
| 电池保护 SRAM | 解释持续供电可以保持易失数据 | 理解原理 |
| 校验位、NAND 附加区 | 说明可靠性也要占空间 | 区分用户容量与管理开销 |
| DIP、TSOP、BGA、SIPP、SIMM、DIMM | 说明封装与模块接口 | 认识区别与用途 |
| 特定 CPU 的 Cache 容量、相联路数 | 展示映射技术的真实应用 | 理解路数含义,型号数字无需逐个背 |
| 多级页表 | 解释页表存储开销怎样管理 | 认识查表路径与稀疏分配思想 |
所以,你不需要把每一个编程电压、脉冲宽度、封装针数都背下来,才能算“学会这一章”。但你需要知道那些表在描述什么,并能在题目给表时按条件分析。
先验收,再看答案
七道短自测
- 芯片总容量是多少字节?需要多少位片内地址?
- 按字节编址,24 位地址、32 位数据总线,最大可寻址容量是多少?
- 用 芯片组成 ,需要几颗、分几组?
- 主存地址 20 位,Cache 16KB,块 64B,四路组相联。Tag、组索引、偏移各几位?
- LRU 与 LFU 的区别是什么?
- TLB 未命中,是否一定要从磁盘调页?
- 页面 4KB,VA=
5123H,虚页 5 映射到物理页框 A,PA 是多少?
展开自测答案与达标标准
- ;8K 个单元,需要 13 位片内地址。
- ;数据总线宽度不再乘进去。
- 每组 颗,共 组,总共 8 颗。
- 总行数 256;组数 。偏移 6 位,组索引 6 位,Tag 8 位。
- LRU 看最后一次使用距今多久;LFU 看统计期内使用次数。
- **不一定。**查页表后可能发现页面已经驻留。
- 偏移仍为
123H,页框换成 A,所以A123H。
**这一章的达标线是:容量和扩展能自己算,Cache 地址能自己拆,三种虚拟地址转换能自己走一遍,其余内容能按“原理—特点—用途”解释。**有哪一步不顺,就沿题号回到相应例子重新做一遍。
原讲义 3.7 · 全部习题
29 道习题的答题卡
题意经过归纳,保留题号与计算条件。先自行写答案,再展开核对;完整推导与图解请沿链接回查正文。涉及历史器件时,以题目给定条件为准。
习题 3.1 / 存储器分类与特点
分别按介质、系统角色、读写与保持特性说明分类。
展开答题要点
按介质有磁、光、半导体;按角色有寄存器、Cache、主存、外存。半导体器件再按保持和改写特点区分 SRAM、DRAM、ROM 家族等。同一器件可以同时属于多个维度,例如 SSD 是半导体外存,主要采用 NAND Flash。
习题 3.2 / 半导体器件的优缺点与用途
比较常见 RAM 与 ROM 家族器件,并说明用途。
展开答题要点
SRAM 快、不需刷新,但每位器件较多、成本较高,常用于 Cache;DRAM 密度较高、适合主存,但需要刷新。ROM/EEPROM/Flash 非易失,适合程序、配置、长期数据;改写方法、速度、粒度和寿命依器件不同,不能把它们都当普通 RAM 用。
习题 3.3 / RAM 与 ROM 的工作方式
说明两种典型 RAM 的保持原理,并列出 ROM 家族。
展开答题要点
SRAM 用双稳态反馈保持,DRAM 用电容电荷保持并刷新。ROM 家族包括掩模 ROM、一次编程 PROM、电编程/紫外线擦除 EPROM、电擦写 EEPROM、通常按块电擦除的 Flash。具体器件的模式按手册分析。
习题 3.4 / 磁与光存储器
说明类型、访问特点和基本读取过程。
展开答题要点
磁盘利用磁头定位到盘面位置读写,磁带侧重顺序访问,磁鼓、磁芯、磁泡是本章历史例子;本章这些介质断电可保持。光存储用激光读介质光学特征,经光电转换得到电信号,例子包括 CD-DA、CD-ROM、VCD、DVD。
习题 3.5 / 主存与外存
用系统角色区分,不能只看机箱位置。
展开答题要点
主存保存运行中需由处理器访问的程序和数据,典型为 DRAM;外存长期保存程序、文件等,典型为 HDD、SSD、光盘等。机箱内部的 SSD 仍是外部辅助存储器。
习题 3.6 / 辅助存储器接口
列出讲义介绍的接口并概括定位。
展开答题要点
IDE/ATA/PATA、SCSI、SATA、SAS、SD、eMMC、UFS。PATA 强调并行,SATA/SAS 等采用串行;SD 为存储卡接口,eMMC/UFS 是含控制器的闪存存储方案。接口与保存信息的介质是不同概念。
习题 3.7 / 选择存储器的因素
除容量外,还需要看哪些条件?
展开答题要点
容量、存取时间、存取周期、持续带宽、可靠性、功耗、成本、供电与接口兼容性、是否掉电保持、擦写粒度和寿命等。先看应用需要,不是单看一个速度数字。
习题 3.8 / 可擦写器件为什么还叫 ROM
比较 EPROM、EEPROM、Flash 的共同点与擦除差别。
展开答题要点
本章这些器件利用绝缘结构保存电荷、断电保持,属于历史 ROM 家族;可在特定编程/擦除条件下改写,不等于普通 RAM。EPROM 通常紫外线整片擦除,EEPROM 可较细粒度电擦写,Flash 通常按块电擦除。
习题 3.9 / 采用内存条的原因
从系统制造、安装和升级说明。
展开答题要点
把多颗芯片及配套电路组织成标准模块,便于制造、安装、维修与容量升级。DRAM 颗粒保存主存数据,SPD 保存配置参数,PCB 与金手指等完成模块连接;SPD 不是用户程序的大容量主存。
习题 3.10 / DDR 到 DDR4 的改进
从传输边沿、预取、供电和 Bank 组织概括。
展开答题要点
DDR 在两个时钟边沿传数据;DDR/DDR2/DDR3/DDR4 的典型预取深度依次为 2n/4n/8n/8n,典型标准电压逐步降低。DDR4 引入 Bank Group 等以改善操作组织。相同 MT/s、位宽和通道数下,理论带宽相同,不能仅凭代际名称判定翻倍。
习题 3.11 / 分层存储的意义
说明为什么不全用最快或最便宜的器件。
展开答题要点
高速器件通常容量和每位成本受约束;通过少量快速存储配合大量较慢存储,利用局部性在可接受成本下兼顾速度与容量。层次职责与介质类型分别理解。
习题 3.12 / 虚拟存储器解决的问题
除容量不足以外,再说出两个目的。
展开答题要点
按需装入缓解容量限制,映射解除程序与固定物理位置的绑定,为不同程序提供地址空间,并支持保护和受控共享。物理内存不足时仍可能频繁调页,并不会凭空得到同速的大内存。
习题 3.13 / VA 与 PA 的联系
说明数字相同或不同分别意味着什么。
展开答题要点
VA 是程序使用的地址;PA 是转换后用于访问物理存储位置的地址。通过映射联系,数值不必相同;不同程序可用相同 VA 映射到不同物理位置。权限与驻留状态也要检查。
习题 3.14 / 页面大小的权衡
为什么不能回答“越大越快”?
展开答题要点
大页减少页表项并扩大相同 TLB 项数的覆盖,但可能增加单次搬运、无用数据与内部碎片;小页分配更细,但表项更多、TLB 覆盖更小,管理和转换活动可能增多。最终效果依工作负载与系统而定。
习题 3.15 / 段、页、段页式转换
分别写出查表路径、合法性检查和物理地址形成方式。
展开答题要点
段式:段号查段表,检查范围、驻留和权限,基址加段内偏移。页式:虚页号查页表,检查表项,页框号乘页大小再加偏移。段页式:段号找本段页表,再用段内页号找页框,保留页内偏移。按字节求表项地址时,索引需乘表项字节数。
习题 3.16 / Cache 的原理、作用与场合
解释为什么保存一小部分副本就可能有效。
展开答题要点
时间与空间局部性使近期和相邻数据被重复访问;Cache 以块保存下一级部分内容,命中时降低平均访问时间。硬件 Cache 用于处理器等存储层次;更一般的软件系统也采用缓存思想,具体一致性与管理方式另论。
习题 3.17 / Cache 与主存正确更新
说明写通、写回怎样避免读到旧数据。
展开答题要点
写通把 Cache 更新也送往主存,可配写缓冲;写回先更新 Cache 并置 Dirty,在替换脏块或规定回写时更新主存。写回容许受管理的暂时差异,不能把一致性理解成任何时刻两个副本逐位相等。多访问者情形还需相应一致性机制。
习题 3.18 / Cache line 的基本信息
区分数据容量和管理开销。
展开答题要点
数据、Tag、有效位是基本内容。写回常需脏位,替换与一致性状态依设计配置。题中 Cache 容量通常指数据区,若问硬件总存储,还要加标记与管理位。
习题 3.19 / 替换策略
区分 Random、FIFO、LFU、LRU。
展开答题要点
Random 随机;FIFO 看最早装入;LFU 看约定统计范围内的次数;LRU 看最后一次访问距今多久。先使用无效空行,候选满时再淘汰;组相联限目标组内,直接映射没有任意选行余地。
习题 3.20 / 直接映射的完整计算
主存 1 MB、Cache 16 KB、块 64 B,按字节编址。求总行数及 02021H 的 Cache 位置。
展开答题要点
按本章二进制容量约定:总行数 16K/64=256。地址 8225=128×64+33,故块号 128,偏移 21H,行号 128,Tag 数值 0;地址字段为 6/8/6 位。Cache 数据区地址为 2021H。这次数值相同只是例子的结果。
习题 3.21 / 八路组相联的完整计算
沿用上一题条件改成八路;求 s/u/W 位数、02021H 的组号与 Tag 位数。
展开答题要点
256 行÷8=32 组;按讲义字段,s/u/W 分别为 9/5/6 位。主存块号 128,组号 128 mod 32=0,Tag 数值 floor(128/32)=4,Tag 宽度 9 位。地址不能决定组内哪一路。
习题 3.22 / 40 位字节地址空间
按字节编址,40 位地址线、16 位数据线,最大可寻址容量是多少?
展开答题要点
2⁴⁰ 字节,严格写为 1 TiB,按本章旧单位写法为 1 TB。16 位数据通路不能再乘入地址空间;题目给的是可寻址上限,并未证明装有这么多内存。
习题 3.23 / 1M×1 组成 1M×8
给出芯片数、地址与数据线连接、片选关系。
展开答题要点
8 片,位扩展。20 位片内地址并联;每片提供 D0—D7 中的一位,所有片同时选中并同步读写。总共仍是 1M 个八位单元,不是 8M 个单元。
习题 3.24 / 4K×8 组成 4K×16
给出芯片数与高低字节分工。
展开答题要点
2 片,位扩展。12 位字地址并联,一片负责 D7…D0,另一片负责 D15…D8,同步选中。若 CPU 按字节编址,通常 CPU A1 对应芯片 A0,并配合字节使能;不能把组织图的字地址直接当 CPU 字节地址。
习题 3.25 / 64K×8 组成 256K×8
给出译码关系与从 0 开始的各片地址范围。
展开答题要点
4 片,字扩展。A0—A15 并联;A16/A17 经 2→4 译码,只选一片。四段为 00000H—0FFFFH、10000H—1FFFFH、20000H—2FFFFH、30000H—3FFFFH。数据线共用,未选中的输出高阻。
习题 3.26 / 八片 1K×8 组成 8K×8
给出片内地址、组选择地址和地址范围公式。
展开答题要点
8 片,字扩展。A0—A9 为片内地址,A10—A12 经 3→8 译码。第 g 片占 g×400H 至 g×400H+3FFH;首片 0000H—03FFH,末片 1C00H—1FFFH。
习题 3.27 / 四片 4K×8 组成 8K×16
分别说明每组片数与组数。
展开答题要点
2 组,每组 2 片。组内拼成 4K×16;组间字扩展成 8K×16。12 位片内字地址共用,字地址 A12 选组;组内两片分高低八位。换成 CPU 字节编址时,组选择通常对应 CPU A13。
习题 3.28 / NOR 与 NAND 的嵌入式连接
比较用途、访问接口、是否能直接取指,以及管理要求。
展开答题要点
本章并行 NOR 有独立地址、数据与控制线,可映射到可取指区域并支持 XIP;原始 NAND 经控制器在 I/O 引脚分时传命令、地址和数据,常按页读/编程、按块擦除,并处理 ECC/坏块等。原始 NAND 的代码通常需先搬入可执行存储器;具体启动机制看 SoC。
习题 3.29 / ARM 系统扩展 RAM
从器件选择、线路连接到控制器配置说明步骤。
展开答题要点
先查具体 ARM SoC 的外部存储控制器支持 SRAM、SDRAM 或其他哪类器件;确定容量、位宽、地址组织和片选,必要时做位/字扩展;连接地址、数据、控制与时钟,配置地址映射、访问时序、模式与刷新等。只有线路连接而未正确配置,通常不能保证工作。
做题前最后检查
这几处最容易把会做的题做错
- 先写单位:b 与 B 不同,芯片的 N×M 是单元数与每单元位数;本章 KB/MB/TB 的旧写法按二进制约定理解。
- 先写编址单位:按字节编址的容量由地址位数决定,不能再乘数据总线宽度。字地址换成 CPU 字节地址可能要移位。
- 先找组,再找路:地址决定候选组,不决定具体路;Tag 数值与 Tag 位数分别回答不同问题。
- 先说明策略:写回允许主存暂旧,但脏块不能直接丢弃。LRU 看最近使用,LFU 看次数,FIFO 看进入顺序。
- 先查表项状态:TLB 未命中不等于缺页;缺页不等于访问合法;段偏移、页框及表项长度都需要按规则检查。
讲义中需要留意的表述已在正文说明:典型 EPROM 擦除态并非“全 0”;FPM 是同一行多次选列;DDR4 预取仍为 8n;LRU 并非“使用次数最少”;刷新与预充电也不是同一操作。理解原因,比单独记一句纠正更稳。
过关时,你应该能独立完成五道芯片扩展、两道 Cache 映射,再把段、页、段页式地址转换各走一遍。其余器件、接口、模块与历史内容,至少能按“原理—特点—用途”解释。