日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > windows >内容正文

windows

Windows内存管理学习笔记(二)—— 物理内存的管理

發(fā)布時間:2025/3/21 windows 21 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Windows内存管理学习笔记(二)—— 物理内存的管理 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

Windows內(nèi)存管理學(xué)習(xí)筆記(二)—— 物理內(nèi)存的管理

    • 物理內(nèi)存
      • 實驗一:理解MmNumberOfPhysicalPages
    • MmPfnDatabase
      • _MMPFN
        • 物理頁狀態(tài)
        • 六個鏈表
      • 實驗二:理解零化鏈表
      • 實驗三:查看進程占用的所有物理頁

物理內(nèi)存

最大物理內(nèi)存

  • 10-10-12分頁:最多識別4GB物理內(nèi)存
  • 2-9-9-12分頁:最多識別64GB物理內(nèi)存
  • 操作系統(tǒng)限制

  • 在xp系統(tǒng)中,即使采用2-9-9-12分頁,仍然無法使用超過4GB的物理內(nèi)存(可理解為 4GB以上的內(nèi)存條)
  • 而在windows 2003windows 2008系統(tǒng)中,即使為32位系統(tǒng),但若采用2-9-9-12分頁,就可以識別4GB以上的物理內(nèi)存
  • 思考:為什么?
    答案:由內(nèi)核文件中的幾個函數(shù)限制

    實際物理內(nèi)存
    物理內(nèi)存總數(shù) = MmNumberOfPhysicalPages * 4

    實驗一:理解MmNumberOfPhysicalPages

    1)打開任務(wù)管理器,查看物理內(nèi)存

    2)查看MmNumberOfPhysicalPages(單位:物理頁)

    命令:dd MmNumberOfPhysicalPages


    3)計算物理內(nèi)存

    結(jié)論:物理內(nèi)存總數(shù) = MmNumberOfPhysicalPages * 4

    思考:這么多物理內(nèi)存,操作系統(tǒng)如何進行管理
    答案:通過全局?jǐn)?shù)組MmPfnDatabase

    MmPfnDatabase

    描述

  • 全局結(jié)構(gòu)體數(shù)組,稱為“頁幀數(shù)據(jù)庫”,包含了當(dāng)前操作系統(tǒng)中所有的物理頁
  • 每一個物理頁都有一個對應(yīng)的MMPFN結(jié)構(gòu)體
  • 通過全局變量MmPfnDatabase可以找到這個結(jié)構(gòu)體的起始位置(在WinDbg中使用命令dd MmPfnDatabase進行查看)
  • 每一個MMPFN結(jié)構(gòu)體之間在內(nèi)存中是緊挨著的
  • 定義:_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與物理頁的對應(yīng)關(guān)系

  • 通過當(dāng)前MMPFN結(jié)構(gòu)體找到對應(yīng)的物理頁
    物理頁 = 當(dāng)前_MMPFN索引值*0x1000

  • 通過當(dāng)前物理頁找到對應(yīng)的MMPFN結(jié)構(gòu)體
    _MMPFN = *MmPfnDatabase + 0x1c*(物理頁/0x1000)

  • 物理頁狀態(tài)

    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; //決定了當(dāng)前頁的狀態(tài),空閑情況下分為六種狀態(tài)//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通過六個鏈表,將所有相同類型的物理頁串到一起

  • MmZeroedPageListHead
    零化鏈表(是系統(tǒng)在空閑的時候進行零化的,不是程序自己清零的那種)
  • MmFreePageListHead
    空閑鏈表(物理頁是周轉(zhuǎn)使用的,剛被釋放的物理頁是沒有清0,系統(tǒng)空閑的時候有專門的線程從這個隊列摘取物理頁,加以清0后再掛入MmZeroedPageListHead)MMPFNLIST MmZeroedPageListHead = {0, // TotalZeroedPageList, // ListNameMM_EMPTY_LIST, //FlinkMM_EMPTY_LIST // Blink }; 此時,MMPFN對應(yīng)結(jié)構(gòu)體如下typedef struct _MMPFN {PFN_NUMBER Flink;PMMPTE PteAddress;PFN_NUMBER Blink;u3;MMPTE OriginalPte;u4; } MMPFN, *PMMPFN;
  • MmStandbyPageListHead
    備用鏈表(當(dāng)系統(tǒng)內(nèi)存不夠的時候,操作系統(tǒng)會把物理內(nèi)存中的數(shù)據(jù)交換到硬盤上,此時頁面不是直接掛到空閑鏈表上去,而是掛到備用鏈表上,雖然我釋放了,但里邊的內(nèi)容還是有意義的)
  • MmModifiedPageListHead
  • MmModifiedNoWritePageListHead
  • MmBadPageListHead
    壞鏈
  • 實驗二:理解零化鏈表

    1)在WinDbg中查看全局變量MmPfnDatabase的值

    2)查看全局變量MmZeroedPageListHead的值

    3)定位第一個零化鏈表
    公式:MmZeroedPageList[0] = MmPfnDatabase + MmZeroedPageListHead[3]*0x1c

    4)查看后四項(紅色代表Flink,藍色代表Blink)

    總結(jié):零化鏈表結(jié)構(gòu)如下圖所示

    實驗三:查看進程占用的所有物理頁

    1)在WinDbg中定位目標(biāo)進程

    2)查看該進程的EPROCESS結(jié)構(gòu)體,定位偏移為0x1f8的成員

    命令:kd> dt _EPROCESS 866bf7e8

    kd> dt _EPROCESS 866bf7e8 ntdll!_EPROCESS......+0x1f8 Vm : _MMSUPPORT......

    3)查看_MMSUPPORT結(jié)構(gòu)體

    命令: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 : 0xb7

    4)查看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 //物理頁個數(shù)+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] 1

    5)查看最后一個成員

    命令:dd 0xc0883cfc L4c2

    總結(jié)

    以上是生活随笔為你收集整理的Windows内存管理学习笔记(二)—— 物理内存的管理的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。