Skip to content

408

计算机组成原理

CO-03-11 虚拟存储器(页式/段式/段页式)


一、定位信息

项目内容
所属圈层核心层
前置知识回顾需了解主存和辅存(磁盘)的层次关系,了解地址的概念(程序中的逻辑地址 vs 物理内存中的物理地址),了解页表的基本作用(地址映射)
知识网络定位本单元是存储器层次结构的最高级抽象——虚拟存储器将主存和辅存统一管理,为每个程序提供一个远大于实际物理内存的虚拟地址空间。虚拟存储器是Cache思想在主存-辅存层次的延伸,TLB(CO-03-12)是其加速机制
考点热度等级H级 — 虚拟存储器的地址转换过程是高频综合题考点,近5年出现≥4次,分值5–10分

二、知识点讲解

2.1 虚拟存储器的基本概念

虚拟存储器(Virtual Memory) 是一种通过硬件和操作系统配合,将主存和辅存统一管理的技术。它为每个程序提供一个虚拟地址空间(通常远大于物理内存容量),程序使用虚拟地址访问数据,硬件和操作系统自动将虚拟地址转换为物理地址。

核心思想

  • 程序运行时,不需要将全部内容放入主存
  • 只将当前需要的部分(活跃页面/段)放在主存
  • 其余部分放在辅存(磁盘),需要时再调入
  • 程序员看到的是一个连续的、大的虚拟地址空间,无需关心物理内存的分配

与Cache的类比

  • Cache:CPU和主存之间,块(Block)为单位
  • 虚拟存储器:主存和辅存之间,页(Page)或段(Segment)为单位

2.2 页式虚拟存储器

基本概念

  • 虚拟地址空间:程序使用的地址空间,分为固定大小的页(Page)
  • 物理地址空间:实际主存的地址空间,分为同样大小的页框(Page Frame/物理块)
  • 页表(Page Table):记录虚拟页号到物理页框号的映射关系
  • 页大小:通常为4KB(2122^{12} 字节),也有2MB、4MB等大页

虚拟地址到物理地址的转换

虚拟地址 = 虚拟页号 + 页内偏移

物理地址 = 物理页框号 + 页内偏移

转换过程:

  1. 从虚拟地址中提取虚拟页号和页内偏移
  2. 用虚拟页号查页表,得到物理页框号
  3. 物理页框号拼接页内偏移,得到物理地址

注意:页内偏移在转换前后不变(因为页和页框大小相同)。

页表项(PTE)的内容

每个页表项包含:

  • 物理页框号:该虚拟页对应的物理页框
  • 有效位(Valid/Present):该页是否在主存中(1=在主存,0=不在主存/在磁盘)
  • 访问位(Reference):该页是否被访问过(用于替换算法)
  • 修改位(Dirty):该页是否被修改过(用于写回策略)
  • 保护位:读/写/执行权限

缺页中断

当访问的虚拟页不在主存中(有效位=0)时,发生缺页中断(Page Fault)

  1. 操作系统从磁盘将该页调入主存
  2. 如果主存已满,需要选择一页替换出去(页面替换算法,如LRU、FIFO、Clock等)
  3. 如果被替换的页被修改过(脏位=1),需要写回磁盘
  4. 更新页表
  5. 重新执行引发缺页的指令

2.3 段式虚拟存储器

基本概念

  • 段(Segment):按照程序的逻辑结构划分,每个段有独立的意义(如代码段、数据段、堆栈段)
  • 每个段的长度可以不同
  • 段表(Segment Table):记录每个段的基址(起始物理地址)和段长

虚拟地址到物理地址的转换

虚拟地址 = 段号 + 段内偏移

转换过程:

  1. 从虚拟地址中提取段号和段内偏移
  2. 用段号查段表,得到段基址和段长
  3. 检查:段内偏移 < 段长(否则越界中断)
  4. 物理地址 = 段基址 + 段内偏移

2.4 段页式虚拟存储器

基本概念

段页式结合了段式和页式的优点:

  • 先分段(按逻辑结构),再将每段分页(固定大小)
  • 每个段有自己的页表

虚拟地址到物理地址的转换

虚拟地址 = 段号 + 段内页号 + 页内偏移

转换过程:

  1. 用段号查段表,得到该段的页表起始地址
  2. 用段内页号查该段的页表,得到物理页框号
  3. 物理页框号拼接页内偏移,得到物理地址

需要两次查表(第一次查段表,第二次查页表),速度较慢,通常用TLB加速。

2.5 三种方式的对比

对比项页式段式段页式
划分单位固定大小的页可变长度的段先分段,再分页
虚拟地址页号+页内偏移段号+段内偏移段号+页号+页内偏移
地址转换查页表,1次查段表,1次查段表+页表,2次
物理地址页框号+偏移基址+偏移页框号+偏移
内部碎片有(页内)有(页内)
外部碎片
共享与保护不方便方便(按段共享)方便
硬件支持页表基址寄存器段表基址寄存器段表+页表基址寄存器

三、记忆与理解辅助

3.1 口诀记忆

页式口诀:"固定分页查页表,偏移不变框号找"

  • 页大小固定,通过查页表将虚拟页号转为物理页框号,页内偏移不变

段式口诀:"逻辑分段查段表,基址加偏移要对"

  • 段按逻辑划分,查段表得到基址,物理地址 = 基址 + 段内偏移

段页式口诀:"先查段表找页表,再查页表找框号"

  • 两次查表:先段表后页表

3.2 对比表:页式 vs 段式 vs 段页式(重点对比表)

特性页式段式段页式
划分依据物理(固定大小)逻辑(程序结构)先逻辑后物理
页/段大小固定可变页固定,段可变
地址结构页号+偏移段号+偏移段号+页号+偏移
查表次数1次1次2次
内部碎片
外部碎片
共享方便性
实际应用Linux、Windows较少单独使用x86架构

3.3 地址转换流程图示

页式地址转换流程(文字描述):

虚拟地址 → [提取页号] → 查页表 → [有效位=1?] 
    → 是:取出物理页框号 → 拼接偏移 → 物理地址
    → 否:缺页中断 → 从磁盘调入 → 更新页表 → 重新执行

段页式地址转换流程(文字描述):

虚拟地址 → [提取段号] → 查段表 → [越界检查] 
    → 未越界:取出页表基址 → [提取页号] → 查页表 → [有效位=1?]
        → 是:取出物理页框号 → 拼接偏移 → 物理地址
        → 否:缺页中断

四、例题与精解

例题1(基础)

题目:某计算机采用页式虚拟存储器,虚拟地址32位,物理地址24位,页大小4KB。问: (1)虚拟地址和物理地址如何划分? (2)页表至少有多少个页表项? (3)每个页表项至少需要多少位来存放物理页框号?

命题意图:考查页式虚拟存储器的地址划分基本计算。

审题分析:虚拟地址32位,物理地址24位,页大小4KB = 2122^{12} 字节。

解题思路:页内偏移由页大小决定,虚拟页号和物理页框号由剩余位决定。

完整步骤

(1)地址划分:

  • 页内偏移位数 = log2(4K)=log2(212)=12\log_2(4\text{K}) = \log_2(2^{12}) = 12
  • 虚拟页号位数 = 3212=2032 - 12 = 20
  • 物理页框号位数 = 2412=1224 - 12 = 12

(2)页表项数:

虚拟页号有20位,可表示 220=1M2^{20} = 1\text{M} 个虚拟页。

页表至少有 220=10485762^{20} = 1048576 个页表项(每个虚拟页对应一个页表项)。

(3)物理页框号位数:

物理页框号需要12位(因为物理地址24位 - 偏移12位 = 12位)。

方法反思

  1. 页大小决定了偏移位数,页和页框的偏移位数相同。
  2. 虚拟地址空间越大,页表项越多(页表越大)。
  3. 物理内存越大,每个页表项中物理页框号的位数越多。

例题2(中等)

题目:某系统采用页式虚拟存储器,页大小为4KB,页表如下(部分):

虚拟页号物理页框号有效位
031
10
211
301
40

问: (1)虚拟地址 00003H 对应的物理地址是什么? (2)虚拟地址 01001H 对应的物理地址是什么? (3)访问虚拟地址 02000H 会发生什么?

命题意图:考查页式虚拟存储器的地址转换过程。

审题分析:页大小4KB,偏移12位。虚拟地址用16进制表示。

解题思路:提取虚拟页号和页内偏移,查表转换。

完整步骤

页大小4KB = 4096 = 1000H,所以页内偏移为地址的低12位(低3位十六进制数)。

(1)虚拟地址 00003H:

  • 虚拟页号 = 00003H / 1000H = 0
  • 页内偏移 = 00003H mod 1000H = 003H
  • 查页表:虚拟页0 → 物理页框3,有效位=1
  • 物理地址 = 3 × 1000H + 003H = 3000H + 003H = 3003H

(2)虚拟地址 01001H:

  • 虚拟页号 = 01001H / 1000H = 1
  • 页内偏移 = 01001H mod 1000H = 001H
  • 查页表:虚拟页1 → 有效位=0,该页不在主存中
  • 发生缺页中断,操作系统需要从磁盘将该页调入主存

(3)虚拟地址 02000H:

  • 虚拟页号 = 02000H / 1000H = 2
  • 页内偏移 = 02000H mod 1000H = 000H
  • 查页表:虚拟页2 → 物理页框1,有效位=1
  • 物理地址 = 1 × 1000H + 000H = 1000H

方法反思

  1. 页内偏移 = 虚拟地址 mod 页大小,这个值在转换前后不变。
  2. 有效位=0表示缺页,需要缺页中断处理。
  3. 页大小为4KB时,低12位(3位十六进制)是偏移,高位是页号。

五、考情分析

项目内容
近5年考查频次≥4次
常见题型选择题(三种虚拟存储方式对比)、综合题(地址转换过程、页表计算)
分值占比选择题2分,综合题5–10分
命题趋势虚拟存储器地址转换是高频大题。近年趋势是将页式虚拟存储器与TLB、Cache结合,出完整的多级地址转换综合题

六、易错点提醒

易错点1

  • 错误表现:页式虚拟存储器中,认为虚拟页号和物理页框号的位数一定相同
  • 错误原因:虚拟地址空间和物理地址空间大小通常不同
  • 正确做法:虚拟页号位数 = 虚拟地址位数 - 偏移位数,物理页框号位数 = 物理地址位数 - 偏移位数。两者一般不等

易错点2

  • 错误表现:段页式地址转换时,只查一次表就得到物理地址
  • 错误原因:忽略了段页式需要两次查表
  • 正确做法:段页式先查段表得到页表基址,再查页表得到物理页框号,共两次查表

易错点3

  • 错误表现:计算页内偏移时,用虚拟地址除以页大小取余,但计算页号时忘记用除法
  • 错误原因:混淆除法和取余的用途
  • 正确做法:页号 = 地址 ÷ 页大小(整除),偏移 = 地址 mod 页大小。或者直接按位划分:低 log2(页大小)\log_2(\text{页大小}) 位是偏移,高位是页号

易错点4

  • 错误表现:认为页式虚拟存储器没有内部碎片
  • 错误原因:混淆了内部碎片和外部碎片
  • 正确做法:页式有内部碎片(最后一页可能未填满),但没有外部碎片(页大小固定,不存在"小空闲块无法利用"的问题)。段式相反:无内部碎片,有外部碎片

七、来源标注

  • 依据2026考研统考大纲(408-计算机组成原理-第三章"存储器层次结构")
  • 依据大学本科经典教材共识:唐朔飞《计算机组成原理》、白中英《计算机组成原理》、Patterson & Hennessy《计算机组成与设计》

考研全科复习资料 - 基于2026考研统考大纲