Windows内存管理学习笔记(二)—— 物理内存的管理
Windows內存管理學習筆記(二)—— 物理內存的管理
- 物理內存
- 實驗一:理解MmNumberOfPhysicalPages
- MmPfnDatabase
- _MMPFN
- 物理頁狀態
- 六個鏈表
- 實驗二:理解零化鏈表
- 實驗三:查看進程占用的所有物理頁
物理內存
最大物理內存
操作系統限制
思考:為什么?
答案:由內核文件中的幾個函數限制
實際物理內存
物理內存總數 = MmNumberOfPhysicalPages * 4
實驗一:理解MmNumberOfPhysicalPages
1)打開任務管理器,查看物理內存
2)查看MmNumberOfPhysicalPages(單位:物理頁)
命令:dd MmNumberOfPhysicalPages
3)計算物理內存
結論:物理內存總數 = MmNumberOfPhysicalPages * 4
思考:這么多物理內存,操作系統如何進行管理
答案:通過全局數組MmPfnDatabase
MmPfnDatabase
描述:
定義:_MMPFN *MmPfnDatabase
長度:MmNumberOfPhysicalPages
_MMPFN
//FROM WinDbg nt!_MMPFN+0x000 u1 : __unnamed+0x004 PteAddress : Ptr32 _MMPTE+0x008 u2 : __unnamed+0x00c u3 : __unnamed+0x010 OriginalPte : _MMPTE+0x018 u4 : __unnamed //FROM WRK v1.2 typedef struct _MMPFN {union {PFN_NUMBER Flink;WSLE_NUMBER WsIndex;PKEVENT Event;NTSTATUS ReadStatus;//// Note: NextStackPfn is actually used as SLIST_ENTRY, however// because of its alignment characteristics, using that type would// unnecessarily add padding to this structure.//SINGLE_LIST_ENTRY NextStackPfn;} u1;PMMPTE PteAddress;union {PFN_NUMBER Blink;//// ShareCount transitions are protected by the PFN lock.//ULONG_PTR ShareCount;} u2;union {//// ReferenceCount transitions are generally done with InterlockedXxxPfn// sequences, and only the 0->1 and 1->0 transitions are protected// by the PFN lock. Note that a *VERY* intricate synchronization// scheme is being used to maximize scalability.//struct {USHORT ReferenceCount;MMPFNENTRY e1;};struct {USHORT ReferenceCount;USHORT ShortFlags;} e2;} u3; #if defined (_WIN64)ULONG UsedPageTableEntries; #endifunion {MMPTE OriginalPte;LONG AweReferenceCount;};union {ULONG_PTR EntireFrame;struct { #if defined (_WIN64)ULONG_PTR PteFrame: 57; #elseULONG_PTR PteFrame: 25; #endifULONG_PTR InPageError : 1;ULONG_PTR VerifierAllocation : 1;ULONG_PTR AweAllocation : 1;ULONG_PTR Priority : MI_PFN_PRIORITY_BITS;ULONG_PTR MustBeCached : 1;};} u4;} MMPFN, *PMMPFN;MMPFN與物理頁的對應關系:
通過當前MMPFN結構體找到對應的物理頁
物理頁 = 當前_MMPFN索引值*0x1000
通過當前物理頁找到對應的MMPFN結構體
_MMPFN = *MmPfnDatabase + 0x1c*(物理頁/0x1000)
物理頁狀態
MMFPN->u3.e1定義:
//FROM WRK v1.2 typedef struct _MMPFNENTRY {USHORT Modified : 1;USHORT ReadInProgress : 1;USHORT WriteInProgress : 1;USHORT PrototypePte: 1;USHORT PageColor : 4;USHORT PageLocation : 3; //決定了當前頁的狀態,空閑情況下分為六種狀態//0:MmZeroedPageListHead//1:MmFreePageListHead//2:MmStandbyPageListHead//3:MmModifiedPageListHead//4:MmModifiedNoWritePageListHead//5:MmBadPageListHeadUSHORT RemovalRequested : 1;USHORT CacheAttribute : 2;USHORT Rom : 1;USHORT ParityError : 1; } MMPFNENTRY;六個鏈表
描述:windows通過六個鏈表,將所有相同類型的物理頁串到一起
零化鏈表(是系統在空閑的時候進行零化的,不是程序自己清零的那種)
空閑鏈表(物理頁是周轉使用的,剛被釋放的物理頁是沒有清0,系統空閑的時候有專門的線程從這個隊列摘取物理頁,加以清0后再掛入MmZeroedPageListHead)MMPFNLIST MmZeroedPageListHead = {0, // TotalZeroedPageList, // ListNameMM_EMPTY_LIST, //FlinkMM_EMPTY_LIST // Blink }; 此時,MMPFN對應結構體如下:typedef struct _MMPFN {PFN_NUMBER Flink;PMMPTE PteAddress;PFN_NUMBER Blink;u3;MMPTE OriginalPte;u4; } MMPFN, *PMMPFN;
備用鏈表(當系統內存不夠的時候,操作系統會把物理內存中的數據交換到硬盤上,此時頁面不是直接掛到空閑鏈表上去,而是掛到備用鏈表上,雖然我釋放了,但里邊的內容還是有意義的)
壞鏈
實驗二:理解零化鏈表
1)在WinDbg中查看全局變量MmPfnDatabase的值
2)查看全局變量MmZeroedPageListHead的值
3)定位第一個零化鏈表
公式:MmZeroedPageList[0] = MmPfnDatabase + MmZeroedPageListHead[3]*0x1c
4)查看后四項(紅色代表Flink,藍色代表Blink)
總結:零化鏈表結構如下圖所示
實驗三:查看進程占用的所有物理頁
1)在WinDbg中定位目標進程
2)查看該進程的EPROCESS結構體,定位偏移為0x1f8的成員
命令:kd> dt _EPROCESS 866bf7e8
kd> dt _EPROCESS 866bf7e8 ntdll!_EPROCESS......+0x1f8 Vm : _MMSUPPORT......3)查看_MMSUPPORT結構體
命令:dt _MMSUPPORT 866bf7e8+0x1f8
ntdll!_MMSUPPORT+0x000 LastTrimTime : _LARGE_INTEGER 0x01d6e998`ed894368+0x008 Flags : _MMSUPPORT_FLAGS+0x00c PageFaultCount : 0xb7+0x010 PeakWorkingSetSize : 0xbd+0x014 WorkingSetSize : 0xbd+0x018 MinimumWorkingSetSize : 0x32+0x01c MaximumWorkingSetSize : 0x159+0x020 VmWorkingSetList : 0xc0883000 _MMWSL+0x024 WorkingSetExpansionLinks : _LIST_ENTRY [ 0x864b2a9c - 0x8649323c ]+0x02c Claim : 0+0x030 NextEstimationSlot : 0+0x034 NextAgingSlot : 0+0x038 EstimatedAvailable : 0+0x03c GrowthSinceLastEstimate : 0xb74)查看VmWorkingSetList
命令:dt _MMWSL 0xc0883000
nt!_MMWSL+0x000 Quota : 0+0x004 FirstFree : 0x1e+0x008 FirstDynamic : 0xa+0x00c LastEntry : 0x217+0x010 NextSlot : 7+0x014 Wsle : 0xc0883cfc _MMWSLE //物理頁起始地址+0x018 LastInitializedWsle : 0x4c0 //物理頁個數+0x01c NonDirectCount : 0x33+0x020 HashTable : 0xc0a84000 _MMWSLE_HASH+0x024 HashTableSize : 0x200+0x028 NumberOfCommittedPageTables : 2+0x02c HashTableStart : 0xc0a84000 Void+0x030 HighestPermittedHashAddress : 0xc0e00000 Void+0x034 NumberOfImageWaiters : 0+0x038 VadBitMapHint : 0x16+0x03c UsedPageTableEntries : [1536] 0x34+0xc3c CommittedPageTables : [48] 15)查看最后一個成員
命令:dd 0xc0883cfc L4c2
總結
以上是生活随笔為你收集整理的Windows内存管理学习笔记(二)—— 物理内存的管理的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Windows内存管理学习笔记(一)——
- 下一篇: Windows内存管理学习笔记(三)——