Archive for the ‘Windows’ Category
KdPrint格式化输出
星期一, 16 1 月, 2012TEB PEB
星期日, 15 1 月, 2012密码保护:游戏保护
星期二, 10 1 月, 2012GetNtdllBaseAddress
星期日, 8 1 月, 2012Window分页机制
星期三, 4 1 月, 2012Windows的分页机制是线性地址—>PDE—>PTE—>物理地址,那么具体是怎么映射的呢?
1个PTE占4bytes代表4kb页面大小,1个页表含1024个PTE,因此占4kb代表4M空间大小。那么映射整个地址空间4G需要1024个页表,占4M。
Windows使用了两级页表,即每个页表的基址又由1个PDE占4bytes指示,因此1个页目录占4kb。
Windows将页表本身也映射到了进程的地址空间(准确的说是进程地址空间的系统地址空间)。先看看如果是我们自己该如何安排?
假设把页表本身安排在最低的4M区域,那么页表里第1张页表映射的就是自己!那么第1张页表第1个PTE就是第1张页表的基址,第2个PTE就是第2张页表的基址!
看看这里的第1张页表的PTE是不是和页目录的PDE效果一样?没错,页目录和第1张页表的内容一样,所以可以等价。
现在来看看Windows是如何安排的。
Windows将页表安排在0xc0000000处,算一算页表中的哪张会映射到整个页表本身呢?没错,第(0xc0000000/0x400000(4M)+1=0x301=787)张页表(从1开始)!其偏移是0x300*0x1000(4kb)=0x300000!同样,它也是页目录的基址,即0xc0300000。这就是Windows的页目录自映射方案,节省了4kb页目录空间。