一 Windows 2000内存篇 分页机制介绍( 二 )


一个页目录有1024项,虚拟地址最高的10bit刚好可以索引1024项(2的10次方等于1024) 。一个页表也有1024项,虚拟地址中间部分的10bit,刚好索引1024项 。虚拟地址最低的12bit(2的12次方等于4096),作为页内偏移,刚好可以索引4KB,也就是一个物理页中的每个字节 。
一个虚拟地址转换成物理地址的计算过程就是,处理器通过CR3找到当前页目录所在物理页,取虚拟地址的高10bit,然后把这10bit右移2bit(因为每个页目录项4个字节长,右移2bit相当于乘4)得到在该页中的地址,取出该地址处PDE(4个字节),就找到了该虚拟地址对应页表所在物理页,取虚拟地址第12位到第21位这10位,然后把这10bit右移2bit(因为每个页表项4个字节长,右移2bit相当于乘4)得到在该页中的地址,取出该地址处的PTE(4个字节),就找到了该虚拟地址对应物理页的地址,最后加上12bit的页内偏移得到了物理地址 。
32bit的一个指针,可以寻址范围0x00000000-0xFFFFFFFF,4GB大小 。也就是说一个32bit的指针可以寻址整个4GB地址空间的每一个字节 。一个页表项负责4K的地址空间和物理内存的映射,一个页表1024项,也就是负责1024*4k=4M的地址空间的映射 。一个页目录项,对应一个页表 。一个页目录有1024项,也就对应着1024个页表,每个页表负责4M地址空间的映射 。1024个页表负责1024*4M=4G的地址空间映射 。一个进程有一个页目录 。所以以页为单位,页目录和页表可以保证4G的地址空间中的每页和物理内存的映射 。
每个进程都有自己的4G地址空间,从0x00000000-0xFFFFFFFF 。通过每个进程自己的一套页目录和页表来实现 。由于每个进程有自己的页目录和页表,所以每个进程的地址空间映射的物理内存是不一样的 。两个进程的同一个虚拟地址处(如果都有物理内存映射)的值一般是不同的,因为他们往往对应不同的物理页 。
4G地址空间中低2G,0x00000000-0x7FFFFFFF是用户地址空间,4G地址空间中高2G,
0x80000000-0xFFFFFFFF 是系统地址空间 。访问系统地址空间需要程序有ring0的权限 。

推荐阅读