温故:自映射机制

本文详细介绍了Windows内核中自映射机制的工作原理,通过实例展示了如何初始化非换页内存池的页表项,以及如何利用自映射进行物理页面的虚拟地址计算。内容涉及页目录、页表的布局以及MiGetPdeAddress和MiGetVirtualAddressMappedByPte等函数的使用。
摘要由CSDN通过智能技术生成
/*/x86非PAE的虚拟地址 

4k为一页,12位作为最后的页内偏移 

剩下20位前十位页目录索引,中间十位页表索引,一共会有4k的页目录和4M的页表,windows将页表安排在0xc0000000~0xc0400000,页目录安排在0xc0300000~0xc0400000 

也就是说页目录项本身也会用作页表项 

自映射机制的优点,是让PDE PTE能够根据他们自己的虚拟地址推导出所指向的物理页面的虚拟地址 

这是初始化内核非换页内存池的页表项的一段代码 
/*/ 

StartPde = MiGetPdeAddress (MmNonPagedSystemStart);   
EndPde = MiGetPdeAddress ((PVOID)((PCHAR)MmNonPagedPoolEnd - 1)); 

/*#define MiGetPdeAddress(va)  ((PMMPTE)(((((ULONG)(va)) >> 22) << 2) + PDE_BASE)) 
//这里就是取得十位PDE 乘上4 加上PDE的虚拟地址,得到pde项的地址 
这里是0xC0300ED0,这是该PDE项的虚拟地址 

明确一下各个变量的关系, 
StartPde:0xed000000对应目录项的虚拟地址 
*StartPde:目录项的内容,也就是页表项的物理地址 

接下来的内容,前提是已经开启分页机制,创建好页目录 
工作是 
    1.要初始化非换页内存池的页目录项,分配一个物理页面,将页表基址(其实是物理页面的PFN)填入页目录项 
    2.将这个物理页面里的页表项都清0 
*/ 

while (StartPde <= EndPde) {                                    //给每个目录项的页表项赋值并且清零 

    ASSERT (StartPde->u.Hard.Valid 
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值