Appearance
题目
某计算机按字节编址,采用页式虚拟存储管理方式:
- 虚拟地址和物理地址长度均为 32 位
- 页表项大小为 4 字节
- 页大小为 4 MB
- 虚拟地址结构:
进程 P 的页表起始虚拟地址为 B8C0 0000H,被装载到从物理地址 6540 0000H 开始的连续主存空间中。
请回答下列问题:
(1) 若 CPU 在执行进程 P 的过程中,访问虚拟地址 1234 5678H 时发生了缺页异常,经过缺页异常处理和 MMU 地址转换后得到的物理地址是 BAB4 5678H。在此次缺页异常的处理中,需要为新缺页分配页框并更新相应的页表项。则该页表项的虚拟地址和物理地址分别是什么?该页表项中的页框号更新后的值是什么?(3 分)
(2) 进程 P 的页表所在页的页号是什么?该页对应的页表项的虚拟地址是什么?该页表项中的页框号是多少?(4 分)
解析
准备工作:搞清三个核心公式
页大小 4 MB = B → 页号占高 10 位、页内偏移占低 22 位。
| 求什么 | 公式 |
|---|---|
| 从虚地址提取页号 | 虚地址 >> 22 = 高 10 位 |
| 从虚地址提取页内偏移 | 虚地址 & 0x3FFFFF = 低 22 位 |
| 某页号 N 的页表项的虚拟地址 | 页表起始虚地址 + N × 4(4 = 页表项大小) |
| 某页号 N 的页表项的物理地址 | 页表起始物理地址 + N × 4 |
| 从物理地址提取页框号 | 物理地址 >> 22 = 高 10 位 |
(1)缺页异常处理 — 三个量的计算
Step 1:拆解虚地址 1234 5678H
把 12345678H 转成二进制:
按 (10, 22) 切:
| 字段 | 二进制(高 10 / 低 22) | 十六进制 |
|---|---|---|
| 页号 | 00 0100 1000 | 048H = 72 |
| 页内偏移 | 11 0100 0101 0110 0111 1000 | 345678H |
Step 2:求页表项虚拟地址 + 物理地址
Step 3:求新页框号
物理地址 = BAB4 5678H,页框号 = 高 10 位:
把 BAB4 5678H 转成二进制取高 10 位:
高 10 位 = 1011 1010 10 =
答案汇总
| 量 | 值 |
|---|---|
| 页表项虚拟地址 | B8C0 0120H |
| 页表项物理地址 | 6540 0120H |
| 更新后页框号 | 2EAH |
编者注(计算技巧):
- 048H × 4 = 120H 这一步不要算错。十六进制乘 4 = 二进制左移 2 位,等于"把每位数字 ×4,再处理进位"。048 × 4:8×4 = 32 = 20H,4×4 = 16 = 10H 进 1 位,所以是 0 1 2 0 = 120H。可以快速心算或写竖式验证。
- 虚地址和物理地址的页表项偏移量都是 120H——因为页表项相对于"页表起始"的偏移与"在物理还是虚拟空间"无关,都是 N × 4。
(2)页表所在页的"自指"问题
这一小问的精妙之处在于:页表本身也存在虚地址空间里——它有自己的页号、自己的页表项!
Step 1:求页表所在页的页号
页表起始虚地址 = B8C0 0000H,求其所在页的页号:
把 B8C0 0000H 高 10 位提出来:
高 10 位 = 1011 1000 11 =
Step 2:求"指向页表所在页"的页表项的虚地址
页表里第 2E3H 号项的虚地址 = 页表起始虚地址 + 2E3H × 4:
Step 3:求该页表项的页框号
题目说页表"被装载到从物理地址 6540 0000H 开始的连续主存空间"——意味着页表所在的第一个物理帧就是页框号 = 6540 0000H >> 22。
把 6540 0000H 高 10 位提出来:
高 10 位 = 0110 0101 01 =
答案汇总
| 量 | 值 |
|---|---|
| 页表所在页的页号 | 2E3H |
| 该页对应的页表项虚地址 | B8C0 0B8CH |
| 该页表项中的页框号 | 195H |
编者注("页表的页表项"自指概念):
- 页表是进程地址空间的一部分——它本身也是数据,需要被存到物理内存里、需要有虚地址、需要在页表里有对应的项来记录"页表的物理位置"。
- 这种"自指"在 x86 系统里体现为 PTBR(页表基址寄存器)/ CR3 寄存器——硬件直接用物理地址,绕开"先查谁的页表"的死循环。本题虽然没明示 PTBR 概念,但思路一致:页表起始物理地址 6540 0000H 是已知(由 OS 装载时记录),不需要"查表"得到。
- 2E3H × 4 = B8CH 这一步:2E3 × 4 = 11 × 4 + 14 × 4 × 16 + 2 × 4 × 256 = ... 直接竖式:3×4=12=C, E×4=56=38H 进 3, 2×4+3=11=B → BB8 + 4 = ... 反正答案是 B8CH。考场上慢一点也得算对。
答题套路:本题对答案的位段计算要求高,不要试图速记,一步步写竖式——错一位就全军覆没。