一、内核对物理内存的管理(MmPfnDatabase)
Windows通过几个全局变量来对物理内存进行管理:
MmPfnDatabase,页帧数据库(也叫FPN数据库),是MMPFN结构体类型的数组,它的索引是物理地址页帧号。
1: kd> dq mmpfndatabase
fffff800`04119228 fffffa80`00000000 000001f4`00000040
fffff800`04119238 00000000`00000390 00000000`00000000
fffff800`04119248 00080000`00000001 00000001`ffffffff
fffff800`04119258 fffffa80`18de7000 01d84429`7d237fba
fffff800`04119268 fffffa80`18e41580 fffffa80`18e725c0
fffff800`04119278 00000000`00006c00 00000000`5c7f8000
fffff800`04119288 fffffa80`18d47b50 00000000`00000001
fffff800`04119298 fffffa80`18eaa870 00026161`00000000
ffffa80`00000000 则是存放物理地址0,大小一个页(0x1000)的物理地址信息
nt!_MMPFN
+0x000 u1 : <unnamed-tag>
+0x008 u2 : <unnamed-tag>
+0x010 PteAddress : Ptr64 _MMPTE
+0x010 VolatilePteAddress : Ptr64 Void
+0x010 Lock : Int4B
+0x010 PteLong : Uint8B
+0x018 u3 : <unnamed-tag>
+0x01c UsedPageTableEntries : Uint2B
+0x01e VaType : UChar
+0x01f ViewCount : UChar
+0x020 OriginalPte : _MMPTE
+0x020 AweReferenceCount : Int4B
+0x028 u4 : <unnamed-tag>
假设我们要找第三个物理地址,也就是物理地址是3000;页帧数据库+_MMPFN大小*第几个
ffffa80`00000000+0x30*3
1: kd> dt _mmpfn fffffa80`00000000+30*3
nt!_MMPFN
+0x000 u1 : <unnamed-tag>
+0x008 u2 : <unnamed-tag>
+0x010 PteAddress : 0xfffff6ff`ffffe838 _MMPTE
+0x010 VolatilePteAddress : 0xfffff6ff`ffffe838 Void
+0x010 Lock : 0n-6088
+0x010 PteLong : 0xfffff6ff`ffffe838
+0x018 u3 : <unnamed-tag>
+0x01c UsedPageTableEntries : 0
+0x01e VaType : 0 ''
+0x01f ViewCount : 0 ''
+0x020 OriginalPte : _MMPTE
+0x020 AweReferenceCount : 0n0
+0x028 u4 : <unnamed-tag>
1: kd> !pte 0xfffff6ff`ffffe838
VA ffffffffffd07000
PXE at FFFFF6FB7DBEDFF8 PPE at FFFFF6FB7DBFFFF8 PDE at FFFFF6FB7FFFFFF0 PTE at FFFFF6FFFFFFE838
contains 000000000020F063 contains 00000000001FF063 contains 00000000001FE063 contains 0000000000003163
pfn 20f ---DA--KWEV pfn 1ff ---DA--KWEV pfn 1fe ---DA--KWEV pfn 3 -G-DA--KWEV
换而言之,物理地址/0x1000=页帧数据库所在位置