Appearance
题目
在采用二级页表的分页系统中,CPU 页表基址寄存器中的内容是( )。
错因
A
把"地址"想成虚拟地址了。但页表基址寄存器是 MMU 用来启动地址翻译的入口——如果寄存器里存的是虚拟地址,那 MMU 拿到这个虚拟地址还得先把它翻译成物理地址才能去访问页表,但页表本身就是地址翻译用的,这就循环依赖了。所以入口必须是物理地址,否则永远启动不起来。
C
跑到了二级页表,多半把"二级页表"想成了"二层页表的总称(也包括一级)"。其实"二级页表"是分级中的下一层,里面才是页号 → 页框号的映射。一级页表(外层目录)的每一项指向某一个二级页表的物理起址——所以"二级页表"在这种系统里有很多张(每张对应一段虚拟地址范围),CPU 寄存器只能存"根",存不下全部二级页表的起址。
D
跟 C 是同类错误(盯住"二级页表"),但额外多想了"物理地址"。问题还是:二级页表不是单一的一张表,而是按需分配的多张子表——CPU 寄存器只能存一个值,存不下所有二级页表的起址。寄存器存的是上层的入口(一级页表起址),由它指向各张二级页表。
总解析
二级页表的访问链:
虚拟地址:[一级页号 P1 | 二级页号 P2 | 页内偏移]
↓ ↓
① CR3/页表基址寄存器(一级页表的物理起址)
↓
② P1 索引一级页表 → 拿到对应二级页表的物理起址
↓
③ P2 索引该二级页表 → 拿到目标页框号
↓
④ 页框号 + 偏移 → 物理地址两个关键点:
为什么必须是物理地址? MMU 在做翻译,它访问页表本身不能再走一遍翻译——否则就需要"用页表翻译页表的地址",无限递归。所以页表入口(基址寄存器)必须是 CPU 直接能用的物理地址。
为什么是一级而不是二级? 二级页表在多级分页里是按需分配、有很多张的(每张对应一段虚拟地址范围),不是单一的一张。CPU 寄存器只有一个槽,能存的只有最顶层那张唯一的"根表",也就是一级页表。要找具体某张二级页表,得先查一级页表才能知道。
把两个点交叉对一下选项:
| 选项 | 哪一级 | 虚 / 物 | 评价 |
|---|---|---|---|
| A | 一级 | 虚拟 | 一级对,但虚拟不对(循环依赖) |
| B | 一级 | 物理 | ✓ |
| C | 二级 | 虚拟 | 两边都不对 |
| D | 二级 | 物理 | 物理对,但二级不对(不唯一) |
最终答案是 B。