终于有点搞明白分页机制:
其实32位组成的线性地址是虚拟地址,范围是从00000000H~FFFFFFFFH一共4G
cr3决定了页目录基址,线性地址的高十位是页目录项索引值,然后读取页目录项的高20位,得到页表的基址。在与线性地址的中10位形成的偏移值,找到页表项,然后读取页表项的高20位形成页基址,再加上线性地址的低12位形成物理地址。
启动分页时,先要建立含有PDE,PTE的表格。这个表格含有1024个PDE,1024*1024个PTE。
cr3寄存器的低12位都是0,不起作用,高20位是页目录基址。它保存的是当前活动进程的页目录地址。
这张图片结合http://www.cnblogs.com/wanghj-dz/archive/2011/04/24/2026436.html的图片一起看。主要是看PDE,PTE的结构。
进程主要是对Cr3 、PDE和PTE的初始化
凡是base address,都是20位,xxxxxh形式(五位X)
PDE、PTE的base address加上4K的整数倍,即1000h的整数倍。
PDE的个数就是页表的个数。这个个数是内存除以4M来决定的。这个个数也决定了所需页目录PD的大小为PDE个数*4K
如32M的内存,PDE最多为为8个,页目录所需大小为:8*4Bety=32字节=32Bety。
PTE的个数是固定的1024,一个PTE映射一个4K大小的页,所以1024个PTE映射的物理内存为4k*1024=4M
对于4G内存,可以表示为 1024*1024*4k。后面的1024是固定的PTE的个数*4K,前面的1024表示PDE的个数,也是页表的个数,这个是由真实的内存决定的,4G的内存就是1024个。32M内存就是8个。1024个PDE组成一个页目录。
这个页目录表的基地址由CR3决定的。
以上都应该以页目录表、页表的初始化来整体思考。
内存决定页目录项的个数,这些页目录项组成一个页目录表,这个页目录表的基址由cr3决定,每个页目录项的偏移由线性地址的高十位来决定。一个页目录项决定一个页表,一个页表有1024个页。