Appearance
题目
(本题满分 8 分)
请根据题 44 图给出的虚拟存储管理方式(32 位虚拟地址、二级页表:高 10 位 = 页目录号、中 10 位 = 页号、低 12 位 = 页内偏移;TLB / Cache / PDBR 结构如下图所示),回答下列问题。

图(文字版):CPU 输出 32 位虚拟地址,分高 20 位"虚页号"和低 12 位"页内地址"。虚页号先查 TLB(保存若干 (Tag, 有效位, 实页号) 表项);TLB 命中则直接得实页号;TLB 缺失则进一步把虚页号拆为高 10 位(页目录号)+ 低 10 位(页号),先经 PDBR 查页目录、再查页表得到实页号。实页号 + 页内地址组成物理地址,再分 (Tag 20 位 + 组号 3 位 + 块内 5 位) 进 Cache 查询。
(1) 某虚拟地址对应的页目录号为 6,在相应的页表中对应的页号为 6,页内偏移量为 8,该虚拟地址的十六进制表示是什么?
(2) 寄存器 PDBR 用于保存当前进程的页目录起始地址。
- 该地址是物理地址还是虚拟地址?
- 进程切换时,PDBR 的内容是否会变化?说明理由
- 同一进程的线程切换时,PDBR 的内容是否会变化?说明理由
(3) 为了支持改进型 CLOCK 置换算法,需要在页表项中设置哪些字段?
解析
(1)求虚拟地址的十六进制表示
虚拟地址按图示拆为 3 段:
按位组装(每段右对齐到自己的位段):
| 段 | 二进制(10 / 10 / 12 位) | 偏移到的位 | 十六进制贡献 |
|---|---|---|---|
| 页目录号 = 6 | 0000000110 | 左移 22 位 | 0x01800000 |
| 页号 = 6 | 0000000110 | 左移 12 位 | 0x00006000 |
| 页内偏移 = 8 | 000000000110... 8 → 0000_0000_1000 | 左移 0 位 | 0x00000008 |
按位 OR 求和:
编者注(计算技巧):
- 一定要弄清"高位在左还是在右"。本题"页目录号"在高 10 位 → 应左移 22 位(22 = 10 页号位 + 12 偏移位)。把"6"直接当低位写成
0x6是错的。- 二进制不熟时,可以直接按"段宽 = 4 / 8 / 12 位"切成十六进制:本题中两个 10 位段不是 4 的倍数、易出错,最稳的就是先写出二进制再压回十六进制。
- 如果题目给十六进制虚拟地址反过来求 (页目录号、页号、偏移),把虚拟地址转成 32 位二进制后,从高位向低位按 (10, 10, 12) 切即可。
(2)PDBR 三连问
① PDBR 存的是物理地址还是虚拟地址?
答:物理地址。
为什么? PDBR 的作用是"在 TLB 缺失时告诉 CPU 去哪里查页目录表"。如果 PDBR 里再存一个虚拟地址,CPU 就要再查一次页表才能找到它——但查页表本身就是这次寻址的目的!这会陷入"鸡生蛋蛋生鸡"的死循环。所以 PDBR 必须直接存物理地址,让 MMU 一步到位。
② 进程切换时 PDBR 是否变化?
答:会变化。
每个进程有自己独立的虚拟地址空间和页目录,所以每个进程的页目录在物理内存里的位置不同。进程切换 = 切到另一个虚拟地址空间,必须把 PDBR 改成新进程的页目录物理地址,否则新进程会去用旧进程的页目录、寻址全错。
③ 同进程的线程切换时 PDBR 是否变化?
答:不变化。
同一进程的多个线程共享地址空间和共享页目录——只是寄存器、栈不同。线程切换不需要改地址映射,PDBR 自然不动。
编者注(一句话总结):PDBR 跟着"地址空间"走,不是跟着"执行流"走。
- 进程切换 = 换地址空间 → PDBR 换
- 线程切换 = 换执行流但同一地址空间 → PDBR 不换
这条原则也适用于其它"地址空间相关寄存器"(如 ASID、CR3 在 x86 / TTBR 在 ARM)的考查。
(3)改进型 CLOCK 算法需要哪些页表项字段?
改进型 CLOCK 算法(改进二次机会算法)按 (访问位 A, 修改位 M) 把页面分四类,按"未用未改 → 未用已改 → 已用未改 → 已用已改"的顺序换出:
| (A, M) | 含义 | 优先级(先被替换) |
|---|---|---|
| (0, 0) | 最近未访问且未修改 | 1(最先换出) |
| (0, 1) | 未访问但被改过 | 2 |
| (1, 0) | 最近访问过但未改 | 3 |
| (1, 1) | 最近访问过且改过 | 4(最不情愿换出) |
要支持这个判定,页表项里必须存:
- 访问位(使用位 / Used / Reference Bit)A:每次访问该页时由硬件置 1;扫描时清 0
- 修改位(脏位 / Modified / Dirty Bit)M:写该页时由硬件置 1;只有被换出且 M=1 时才需要回写磁盘
编者注(区分基础 CLOCK vs 改进 CLOCK):
- 基础 CLOCK(二次机会):只用访问位 A。扫描遇 A=0 就换;A=1 就清 0 让它"再活一轮"
- 改进 CLOCK:(A, M) 双位,目的是优先换出"无需写回磁盘"的干净页——少一次磁盘 I/O。所以"修改位 M"是改进版相对基础版新增的核心字段,答题时不要漏。