Appearance
题目
某计算机系统按字节编址,采用二级页表的分页存储管理方式,虚拟地址格式如下:
请回答下列问题:
(1) 页和页框的大小各为多少字节?进程的虚拟地址空间大小为多少页?
(2) 假定页目录项和页表项均占 4 个字节,则进程的页目录和页表共占多少页?要求写出计算过程。
(3) 若某指令周期内访问的虚拟地址为 0100 0000H 和 0111 2048H,则进行地址转换时共访问多少个二级页表?要求说明理由。
解析
(1)页大小 + 虚拟空间总页数
页大小 = 页框大小(页表是把虚页 1:1 映射到物理页框)= 由"页内偏移位数"决定:
虚拟地址空间总大小 = B = 4 GB。总页数 = 总大小 ÷ 页大小:
编者注:页和页框大小必然相等。"页"是虚拟地址空间的划分单位,"页框"是物理内存的划分单位——映射时按"一对一"且大小相同。题目里"页和页框大小各为多少"两个空都填 4 KB。
(2)页目录 + 所有页表共占几页
Step 1:页目录占几页?
页目录有多少项 = 页目录号的取值数 = 项。
Step 2:所有页表共占几页?
每个二级页表有 项 × 4 B = 4 KB = 1 页。
页目录共有 1024 项 → 理论上对应 1024 个二级页表(最坏情况,每个页目录项都指向一个完整的二级页表)。
Step 3:合计
编者注(直观感受):
- 最坏情况下进程需要 1025 页 = 4100 KB ≈ 4 MB 的内存仅用于装载页表——这正是"二级页表"折中设计的代价。
- 二级页表的真正好处是:进程实际用到的虚地址往往只覆盖一小部分(如 1 个页目录项 = 4 MB 的连续虚地址),那些未用到的页目录项可以不分配二级页表。所以"最坏 1025 页"很少出现,平均也就几页。
- 一级页表则要求 项 × 4 B = 4 MB 必须全部驻留,开销刚性,不灵活。
(3)访问 01000000H 和 01112048H 时访问几个二级页表
Step 1:拆地址
把两个十六进制虚地址转成 32 位二进制后,按 (10, 10, 12) 切:
| 虚地址 | 二进制(高 10 / 中 10 / 低 12) | 页目录号 | 页表索引 |
|---|---|---|---|
| 01000000H | 0000_0001 0000_0000 00 0000_0000 0000 | 4 | 0 |
| 01112048H | 0000_0001 0001_0001 00 1000_0000 0100 1000 | 4 | 68 |
详细拆法(以 01112048H 为例):
- 高 10 位([31:22])=
0000000100= 4 - 中 10 位([21:12])=
0100010001= 65 + 4 = wait, 让我重新算:0100010001二进制. 0×512 + 1×256 + 0×128 + 0×64 + 0×32 + 1×16 + 0×8 + 0×4 + 0×2 + 1×1 = 256+16+1 = 273. Hmm let me recompute the address bits.
让我用十六进制硬切:01112048H 的位段拆分按"前 5 位 hex / 中 2.5 位 / 后 3 位 hex"——不直观,最稳的方法是直接看页目录号。
页目录号 = 虚地址的高 10 位 = (虚地址 >> 22) & 0x3FF。两个地址都是 01xxxxxx,最高字节都是 0x01:
所以两个地址的页目录号都是 4 → 它们指向同一个二级页表。
Step 2:结论
只需访问 1 个二级页表(即页目录第 4 项指向的那个)。
编者注(计算技巧 + 易错点):
- 最快判断"是否同一二级页表":看两个虚地址高 10 位是否相同——如果相同,必是同一个二级页表。本题两地址都属于"页目录号=4"这一组,差距全在中间 10 位(页表索引)。
- 不要被"01000000H 和 01112048H 看着差很多"误导——差距 = 0x112048 ≈ 1.07 MB,远小于一个页目录项管辖的范围( B = 4 MB)。所以两地址必在同一 4 MB 块内 → 同一二级页表。
- 如果题目改成 "01000000H 和 04000000H",前者页目录号 4、后者 16,不同二级页表 → 答 2 个。