标签:
在一次操作系统课程上听老师说了这么一个有意思的东西,windows的自映射方案居然达到了把4K的页目录的线性地址“藏”在4M页表里的效果,感觉甚是奇特,于是乎就想着说怎么去算。光会算之后仍旧不满足,我又感觉对我而言有两个问题是很模糊的:
为了解决这两个问题,我查看了很多个博客,但是大多数博客或文章对原理进行了充分的解释,但是并没有例子来说明,个人觉得这样会显得十分空洞,所以下面来跟大家探讨一下有关问题的通俗一点的解释,如果有错误的地方还望指正。
首先我们有如下断言:知道了一个页表的4M空间的线性地址,就可以确定是页目录项的第几项中存放着页目录的物理地址。
首先值得一再强调的就是:页目录项(PDE)中存放的页表的物理地址。先来解释这个“狂言”。我们能够直接知道物理地址只有页目录的物理地址(在CR3寄存器中),内存中的页目录项里放着每个页表的物理地址,所以我们访问页表时只能通过间接的方式来访问其物理地址。通过哪种方式呢,实际上就是通过我们虚拟地址高10位作为索引,CR3寄存器中的值为基址来寻找页表,从而访问其物理地址。假定页目录的虚拟地址并不知道,但我们想通过虚拟地址去访问一个页表的物理地址的时候,我们访问的页目录项始终是第768项,这是因为页表的4M线性地址(这里起始于0xC0000000)确定后,其前10位的值始终都是1100 0000 00。我们想访问不同页表的物理地址,但是我们却每次从同一个位置的同一个页目录项中找到同一个物理地址,那么我们就要发问了,我们明明要访问的是不同页表的物理地址啊,但是我们每次取到的都是相同的页目录的索引号,为什么?
标签:
原文地址:http://www.cnblogs.com/SivilTaram/p/WindowsKernelMapping.html