Appearance
题目
某计算机主存按字节编址,逻辑地址和物理地址都是 32 位,页表项大小为 4 字节。请回答下列问题:
(1) 若使用一级页表的分页存储管理方式,逻辑地址结构为:
则页的大小是多少字节?页表最大占用多少字节?
(2) 若使用二级页表的分页存储管理方式,逻辑地址结构为:
设逻辑地址为 LA,请分别给出其对应的页目录号和页表索引的表达式。
(3) 采用 (1) 中的分页存储管理方式,一个代码段起始逻辑地址为 0000 8000H,其长度为 8 KB,被装载到从物理地址 0090 0000H 开始的连续主存空间中。页表从主存 0020 0000H 开始的物理地址处连续存放(地址自下向上递增)。请计算:
- 该代码段对应的两个页表项的物理地址
- 这两个页表项中的页框号
- 代码页面 2 的起始物理地址
解析
(1)页大小 + 页表最大字节数
页内偏移 12 位 → 页大小 = B = 4 KB
页号 20 位 → 页表项数 = 项
编者注(页表大就是一级页表的痛点):
- 一个进程的页表本身就要 4 MB——而且必须连续存放在物理内存里(一级页表的硬约束)。
- 这是为什么现代系统都用二级 / 多级页表——把"页表自己"分成可按需调入的小块,避免 4 MB 一次性占用。
(2)从 LA 提取页目录号 / 页表索引
页目录号(高 10 位)
C 表达式:
c
((unsigned int)(LA) >> 22) & 0x3FF页表索引(中 10 位)
C 表达式:
c
((unsigned int)(LA) >> 12) & 0x3FF编者注(位运算技巧):
- 提取位段的统一公式:
(addr >> 起始位) & ((1 << 段宽) - 1)- 本题段宽 10 位 → 掩码 =
- 必须用
unsigned int——若用int,右移负数地址会产生算术右移导致结果错。- 也可以写"先掩码后右移"
(addr & 0xFFC00000) >> 22,效果相同。
(3)求页表项物理地址 + 页框号 + 页面 2 物理地址
Step 1:代码段在哪几页?
代码段起始逻辑地址 0000 8000H,长度 8 KB = 2 页(每页 4 KB)。
代码段起始页号:
→ 占用页号 8 和页号 9 两页。
| 页号 | 内容 |
|---|---|
| 8 | 代码页面 1(逻辑地址 0x00008000 ~ 0x00008FFF) |
| 9 | 代码页面 2(逻辑地址 0x00009000 ~ 0x00009FFF) |
Step 2:求页表项的物理地址
页表起始物理地址 = 0x00200000,每项 4 B:
Step 3:求两个页表项中的页框号
代码段被连续装入物理地址 0x00900000 开始的空间,长度 8 KB = 2 个页框:
| 物理页框 | 起始物理地址 | 页框号 |
|---|---|---|
| 第 1 个 | 0x00900000 | = 900H |
| 第 2 个 | 0x00901000 | = 901H |
所以:
- 页表项 8 中的页框号 = 900H(指向代码页面 1)
- 页表项 9 中的页框号 = 901H(指向代码页面 2)
Step 4:代码页面 2 起始物理地址
代码页面 2 占用页框号 901H,起始物理地址:
答案汇总(一图速览)
| 量 | 值 |
|---|---|
| 页表项 1(页号 8)物理地址 | 00200020H |
| 页表项 2(页号 9)物理地址 | 00200024H |
| 页表项 1 中的页框号 | 00900H(即 900H) |
| 页表项 2 中的页框号 | 00901H(即 901H) |
| 代码页面 2 起始物理地址 | 00901000H |
编者注("逻辑地址-页号-页表项-页框-物理地址" 五步链):
- 逻辑地址 → 页号:右移页内偏移位数
- 页号 → 页表项物理地址:页表起始物理地址 + 页号 × 页表项大小
- 页表项 → 页框号:读那个页表项的"页框号字段"(低 20 位若占满,否则掩码取一段)
- 页框号 → 页起始物理地址:页框号左移页内偏移位数
- 页起始物理地址 + 页内偏移 → 物理地址
这条链是页式管理的核心计算流程,所有相关大题(本题、2018-45、2024-45、2026-46)都在反复考察这个流程的某些片段。记住这五步、能反向推导,地址转换题就稳了。