Windows系统中PDE和PTE所占的空间 - ZZ

 

 

转帖:http://blog.sina.com.cn/s/blog_48ed03c80100jn93.html

 

这个问题困扰我已经好几天了,一直想不明白,为什么只需要4M空间,而不是4K+4M,而且于渊的《自己动手写操作系统》一书中确实也用到了4K+4M,难道毛德操先生所言有误,其实不然,通过搜索,我找到了答案,感谢网友wowocock,下面内容转载自http://www.debugman.com/read.php?tid=3128

 

  页目录的地址为什么是C0300000,1个页目录加上1024个页表为什么只使用了1024*4K的地址空间
  对于要映射整个4G地址空间,是需要1024个页表和1个页目录的,每个都是4KB大小,也就是 1024*4KB+1*4KB=4MB+4KB。而实际中Win2k把每个进程的页目录和页表映射到了从 0xC0000000到0xC03FFFFF 这4MB的地址空间中(页目录在0xC0300000开始的4K)。注意是4MB地址空间而不是4MB+4KB。1024个页表和1个页目录,应该是需要(1024+1)*4KB的地址空间的。而现在Win2k只使用了1024*4KB的地址空间这是为什么?

    原因就是页表被映射到了进程的地址空间。
    如果页表和页目录没有被映射到进程的地址空间中,而一个进程的4GB地址空间又都映射了物理内存的话,那么就确实需要1024个物理页来存放页表,和另外1个物理页来存放页目录,也就是需要(1024+1)*4KB的物理内存。
但是页表被映射到了进程的地址空间中,这导致了一个页表的内容和页目录的内容是完全一样的,正是这种完全相同,使得将1024个页表加1个页目录映射到地址空间只需要1024*4KB的地址空间,其中的一个页表和页目录完全重合了。
    一个页表1024项,每项对应4KB地址空间,一个页表对应4MB的地址空间。1024个对应了整个4GB地址空间。1024个页表也被映射到了从 0xC0000000到0xC03FFFFF 的4MB地址空间中。这4MB地址空间也是由一个页表来对应的。我们来看对应于从 0xC0000000到0xC03FFFFF 这4MB的地址空间的页表。该页表有1024项,每项对应一页的地址空间,表明是否在物理内存中,如果在,物理地址是多少。而这个页表是对应页表所在的4MB地址空间的,所以它的每一项对应的一页,正是每个页表所在的页。也就是说这个页表的每一项指出了一个页表是否有物理内存映射,如果有的话,物理地址是多少。这正是页目录所做的工作。把1024个页表映射到了地址空间,导致了1024个页表中的一个的内容和页目录完全重合,它既是页目录又是页表。所以1个页目录加上1024个页表只使用了1024*4K的地址空间。

    页表被映射到地址空间的什么地方,是由操作系统的设计者决定的,他会综合考虑各种问题,作出最后的决定。不过一旦页表所在的地址空间的地址决定了,那么页目录的地址也就决定了,除非他打算多使用一页的地址空间保存和现在一个页表中完全相同的内容。

    Win2k中把页表映射到了从 0xC0000000到0xC03FFFFF 的4MB地址空间中,我们来计算一下负责这4M地址空间的那个页表的地址,那个页表就是和页目录重合的页表。4MB地址空间的首地址0xC0000000显然是由该页表的第一项负责的,我们用这个地址来计算。PTE_Address=(VirtualAddress>>12)*4+0xC0000000,
(0xC0000000>>12)*4+0xC0000000=0xC0000*4+0xC0000000=0x300000+0xC0000000=0xC0300000
正是页目录的虚拟地址。

    0xC0300000到0xC0300FFF这4KB的地址空间,作为普通一页的话由一个PTE指明所在物理页的物理地址,作为一个页表所在页的话由一个PDE指明所在物理页的物理地址,作为页目录的话由CR3指明所在物理页的物理地址。
    0xC0300000到0xC0300FFF这4KB作为普通的一页是由哪个PTE对应呢,PTE_Address=(VirtualAddress>>12)*4+0xC0000000,计算得到0xC0300C00。也就是说0xC0300C00处的4个字节作为PTE,指明了0xC0300000到0xC0300FFF这4KB所在的物理页的物理地址。
    0xC0300000到0xC0300FFF这4KB作为一个页表所在页是由哪个PDE对应呢,PDE_Address=(VirtualAddress>>22)*4+0xC0300000,计算得到0xC0300C00。也就是说0xC0300C00处的4个字节作为PDE,指明了0xC0300000到0xC0300FFF这4KB所在的物理页的物理地址。
    0xC0300000到0xC0300FFF这4KB作为页目录的话,由 CR3 指明所在物理页的物理地址。所以 0xC0300C00 处的4个字节的值,把标志位清0的话,就等于 CR3 中的值。

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值