最近有空又看了下页表原理(页表,永远的痛),很多博客都写得很好,都是一套一套的,什么cpu不直接访问内存啊,什么mmu协助转换虚拟地址,什么虚拟地址转真实地址计算算法,都很对,但是很少人提到一个问题并且作详细解答,页表本身怎么存取的?不是指整个页表的结构怎么存储,页表项又是怎么摆放,而是说,页表放在内存哪里?放在真实内存的哪里?怎么访问的?cpu访问页表的时候用的是虚拟地址吗?如果是,那逻辑不就死循环了吗......
cpu访问虚拟内存 --->
需要查询页表转换真实地址---->
访问页表所在内存 ---->
需要查询页表从而求出页表自己的真实地址---->???
我访问页表所在地址的前提是先从页表中找到页表自己的真实地址?
后来查了一下,综合结论是 (没看错的话): 有一个叫CR3的寄存器,专门存放的是当前进程页表的真实物理地址。否则就会出现上述的蛋生鸡问题。另外,CR0寄存器中的特别位置可以控制CPU是否进入实模式,以及是否在保护模式中禁用MMU(现代系统一般跑在保护模式下),从而可以直接访问内存真实物理地址。更多细节后续再补。
初步研究补充(2021/3/14)