码迷,mamicode.com
首页 > Windows程序 > 详细

关于WIndows内核自映射方案的通俗解释

时间:2015-04-15 00:59:49      阅读:369      评论:0      收藏:0      [点我收藏+]

标签:

  在一次操作系统课程上听老师说了这么一个有意思的东西,windows的自映射方案居然达到了把4K的页目录的线性地址“藏”在4M页表里的效果,感觉甚是奇特,于是乎就想着说怎么去算。光会算之后仍旧不满足,我又感觉对我而言有两个问题是很模糊的:

  • 为什么说0xC0300000是可行的页目录线性地址起始处?
  • 在以0xC0000000为页表的线性地址的条件下,页目录的线性地址的起始处必须是0xC0300000吗?

  为了解决这两个问题,我查看了很多个博客,但是大多数博客或文章对原理进行了充分的解释,但是并没有例子来说明,个人觉得这样会显得十分空洞,所以下面来跟大家探讨一下有关问题的通俗一点的解释,如果有错误的地方还望指正。

Q1:0xC0300000为何可行

    首先我们有如下断言:知道了一个页表的4M空间的线性地址,就可以确定是页目录项的第几项中存放着页目录的物理地址。

  首先值得一再强调的就是:页目录项(PDE)中存放的页表的物理地址。先来解释这个“狂言”。我们能够直接知道物理地址只有页目录的物理地址(在CR3寄存器中),内存中的页目录项里放着每个页表的物理地址,所以我们访问页表时只能通过间接的方式来访问其物理地址。通过哪种方式呢,实际上就是通过我们虚拟地址高10位作为索引,CR3寄存器中的值为基址来寻找页表,从而访问其物理地址。假定页目录的虚拟地址并不知道,但我们想通过虚拟地址去访问一个页表的物理地址的时候,我们访问的页目录项始终是第768项,这是因为页表的4M线性地址(这里起始于0xC0000000)确定后,其前10位的值始终都是1100 0000 00。我们想访问不同页表的物理地址,但是我们却每次从同一个位置的同一个页目录项中找到同一个物理地址,那么我们就要发问了,我们明明要访问的是不同页表的物理地址啊,但是我们每次取到的都是相同的页目录的索引号,为什么?

关于WIndows内核自映射方案的通俗解释

标签:

原文地址:http://www.cnblogs.com/SivilTaram/p/WindowsKernelMapping.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!