/*/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
温故:自映射机制
最新推荐文章于 2024-06-14 04:38:54 发布
本文详细介绍了Windows内核中自映射机制的工作原理,通过实例展示了如何初始化非换页内存池的页表项,以及如何利用自映射进行物理页面的虚拟地址计算。内容涉及页目录、页表的布局以及MiGetPdeAddress和MiGetVirtualAddressMappedByPte等函数的使用。
摘要由CSDN通过智能技术生成