Window中虚拟地址与物理地址之间的转化

如上所述,在确保访问的数据已在物理内存中后,还需要先将虚拟地址转换为物理地址,即"地址映射",才能够真正访问此数据。本节讲述Win32中虚拟内存管理器如何将虚拟地址映射为物理地址。

Win32通过一个两层表结构来实现地址映射,因为4 GB虚拟地址空间为每个进程私有,相应地,每个进程都维护一套自己的层次表结构用来实现其地址映射。第一层表称为"页目录"(page directory),实际上就是一个内存页(4 KB = 4 096 byte)。这一页以四个字节为单元分为1 024项,每一项称为一个"页目录项"(Page Directory Entry,PDE);第二层表称为"页表"(page table),共有1 024个页表。页目录中每一个页目录项PDE对应这一层中的某一个页表,每一个页表也占了一个内存页。这一页中的4 KB,即4 096个字节也像页目录那样被分成1 024项,每项4个字节,页表的每一项则称为"页表项"(Page Table Entry,PTE)。每一个页表项PTE都指向物理内存中的某一个页帧,如图5-2所示。

 (点击查看大图)图5-2  页表已经知道,Win32提供了4 GB(32位)大小的虚拟地址空间。因此每个虚拟地址都是一个32位的整数值,这32位由三个部分组成,如图5-3所示。
 (点击查看大图)图5-3  虚拟地址空间

这三个部分中的第一部分,即前10位为页目录下标,用其可以定位在页目录的1 024项中的某一项。根据定位到的那一项的项值,可以找到第2层页表中的某一个页表。虚拟地址的第二部分,即中间的10位为页表下标,可用来定位刚刚找到的页表的1 024项中的某一项。此项值可以找到物理内存中的某一个页,此页包含此虚拟地址所代表的数据。最后用虚拟地址的第三部分,即最后12位可用来定位此物理页中的特定的字节位置,12位刚好可以定位一个页中的任意位置的字节。

举一个具体的例子,假设在程序中访问一个指针(Win32中的"指针"意味虚拟地址),此指针值为0x2A8E317F,图5-4所示为虚拟地址到物理地址的映射过程。

 (点击查看大图)图5-4  虚拟地址到物理地址的映射过程

0x2A8E317F的二进制写法为0010101010,0011100011,000101111111,为了方便起见,将这32位分成10位、10位和12位。第一个10位00101010用来定位页目录中的页目录项,因为页目录项为四个字节,定位前将此10位左移两位,即0010101000(0x2A8)。再用此值作为下标找到对应的页目录项,此页目录项指向一个页表。同样方法再用第二个10位0011100011定位此页表中的页表项。此页表项指向真正的物理内存,然后用最后12位000101111111定位页内的数据(此时这12位不用再左移,因为物理页内定位时,需要能定位到每一个字节。而不像页目录和页表中,只需要定位每4个字节的第1个字节),即为此指针指向的数据。

上面假设的是此数据已在物理内存中,其实,"判断访问的数据是否在内存中"这一步骤,也是在这个地址映射过程中完成的,Win32总是假使数据已在物理内存中,并进行地址映射。页表项中有一位用来标识包含此数据的页是否在物理内存页中,当取得页表项时,检测此位,如果在,就是本节描述的过程,如果不在,则抛出缺页错误,此时此页表项中包含了此数据是否在调页文件中,如果不在,则为访问违例,如果在,此页表项可查出了此数据页在哪个调页文件中,以及此数据页在该调页文件中的起始位置,然后根据这些信息将此数据页从磁盘中调入物理内存中,再继续进行地址映射过程。已经说过,为了实现虚拟地址空间各进程私有,每个进程都拥有自己的页目录和页表结构,对不同进程而言,页目录中的页目录项值(PDE),以及页表中的页表项值(PTE)都是不同的,因此相同的指针(虚拟地址)被不同的进程映射到的物理地址也是不同的。这也意味着,在不同进程间传递指针是没有意义的。

转自:http://hi.baidu.com/sky_fly_angel/item/58a484c0c07584320831c668

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值