进程的页目录和页表在虚拟地址空间中的位置 当执行一条访问内存的指令时,如果寄存器中的分页标志位已经被设置,CPU就自动完成虚拟地址到物理地址的转换,来完成该指令。CPU在转换地址过程中,并不需要页目录和页表的虚拟地址。但是分页标志位被设置之后,CPU会把所有指令中的地址当做虚拟地址转换成物理地址。所以程序中使用的都是虚拟地址。一个进程的页表和页目录是由系统维护的,比如一个进程申请或者释放内存,系统就需要设置对应的一些页表项。系统需要访问页目录和页表,但是系统只能使用虚拟地址,所以系统必须把页目录和页表映射到地址空间中。对应4G地址空间的1024个页表被顺序映射到了从0xC0000000到0xC03FFFFF的4M地址空间。对应第一个4M地址空间的页表,被映射到了0xC0000000开始的第一个4K地址空间(0xC0000000开始的4K)。对应第二个4M地址空间的页表,被映射到了0xC0000000开始的第二个4K地址空间(0xC0001000开始的4K),以此类推。页目录被映射到了0xC0300000开始处的4K地址空间。0xC0000000到0xC03FFFFF的4M地址空间位于高2G的系统地址空间内,需要ring0的权限才能访问。 页目录项和页表项的最低位,第0位,指明了一页是否映射了物理内存。最低位为1,有效(Valid),表示该页映射了物理内存。页目录项和页表项,4个字节,32bit,有着差不多的结构。使用 Win2k DDK 所附带的内核调试器,Kernel Debugger (KD) ,我们可以得到有效的页目录项和页表项的结构定义,对于使用 X86 CPU 的系统,该结构定义如下 我们可以使用 SoftICE 获得指定进程的页目录,方法如下,首先不加参数的 addr 命令,将列出当前系统中的进程。然后 addr 进程名 ,切换到该进程的地址空间。然后 dd c0300000 l 1000 ,将会在命令窗口输出0xc0300000处的0x1000字节(16进制,也就是4K字节)。然后退出 SoftICE,使用 Symbol Loader 的菜单中的 File -> Save SoftICE History AS.. 就可以把刚才输出的内容保存到文件中。每个进程的页目录都映射到了0xc0300000处,所以我们就得到了页目录的内容。 |
JIURL玩玩Win2k内存篇 分页机制 (二)
最新推荐文章于 2022-02-25 19:38:17 发布