windows内存管理之雾里探花

这篇博客详细探讨了Windows内存管理机制,包括页与结构体的对应、内存等级的划分以及不同状态页面的管理。通过调试器kd查看内存布局,揭示了Windows如何高效管理内存。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

也看了一些windows内存管理方面的资料了,总感觉这方面资料匮乏,写下这篇笔记是为了以后方便查找,肯定有很多错误,以后有更深的理解了再来修改吧!

首选在这之前得理解Cpu的分页机制。在这里我就不做叙述了。

windows内存管理把一个页就对应着一个结构体,它们被存放在一块连续的地方。操作系统定义了一个指针。指向这块地址

kd> dd MMpfndatabase
80560be8  80c36000 0000ff00 00000000 0000003f
80560bf8  00007bfd 00017dff 000149a0 00000b42
80560c08  0000a24a 00000000 00009068 000053cc
80560c18  00000c11 00000000 00000000 00000240
80560c28  00000024 00000000 00000000 0000001e
80560c38  000000fa 000182a9 0001ffff 0001ffff
80560c48  0001ff7c 00000040 00000000 7fff0000
80560c58  80000000 7ffeffff 00000000 00000000

操作系统把物理内存分为了6种等级

1.mmZeroedPageListHead        0
2.mmFreePageListHead        空闲的
3.mmstandyPageListHead
4.mmmodifiedPageListHead
5.mmmodifiednowritePageListHead
6.mmbadPageListHead                坏的

kd> dd mmZeroedPageListHead
80552460  00015ba8 00000000 000112a5 0001154f
80552470  00000000 00000001 ffffffff ffffffff
80552480  00002701 00000002 00007b78 00010e52
80552490  000002a9 00000003 ffffffff ffffffff
805524a0  00000000 00000004 ffffffff ffffffff
805524b0  00000000 00000005 ffffffff ffffffff
805524c0  00000000 00000002 ffffffff ffffffff
805524d0  80552460 80552470 80552480 80552490


kd> dt _mmpfn 80c36000+00015ba8*18 -r
nt!_MMPFN
   +0x000 u1               : __unnamed
      +0x000 Flink            : 0x15ba9
      +0x000 WsIndex          : 0x15ba9
      +0x000 Event            : 0x00015ba9 _KEVENT
         +0x000 Header           : _DISPATCHER_HEADER
      +0x000 ReadStatus       : 0n89001
      +0x000 NextStackPfn     : _SINGLE_LIST_ENTRY
         +0x000 Next             : 0x00015ba9 _SINGLE_LIST_ENTRY
   +0x004 PteAddress       : 0x00056ea0 _MMPTE
      +0x000 u                : __unnamed
         +0x000 Long             : ??
         +0x000 Hard             : _MMPTE_HARDWARE
         +0x000 Flush            : _HARDWARE_PTE
         +0x000 Proto            : _MMPTE_PROTOTYPE
         +0x000 Soft             : _MMPTE_SOFTWARE
         +0x000 Trans            : _MMPTE_TRANSITION
         +0x000 Subsect          : _MMPTE_SUBSECTION
         +0x000 List             : _MMPTE_LIST
   +0x008 u2               : __unnamed
      +0x000 Blink            : 0x15ba7
      +0x000 ShareCount       : 0x15ba7
   +0x00c u3               : __unnamed
      +0x000 e1               : _MMPFNENTRY
         +0x000 Modified         : 0y0
         +0x000 ReadInProgress   : 0y0
         +0x000 WriteInProgress  : 0y0
         +0x000 PrototypePte     : 0y0
         +0x000 PageColor        : 0y000
         +0x000 ParityError      : 0y0
         +0x000 PageLocation     : 0y000
         +0x000 RemovalRequested : 0y0
         +0x000 CacheAttribute   : 0y11
         +0x000 Rom              : 0y0
         +0x000 LockCharged      : 0y0
         +0x000 DontUse          : 0y0000000000000000 (0)
      +0x000 e2               : __unnamed
         +0x000 ShortFlags       : 0x3000
         +0x002 ReferenceCount   : 0
   +0x010 OriginalPte      : _MMPTE
      +0x000 u                : __unnamed
         +0x000 Long             : 0x15be8
         +0x000 Hard             : _MMPTE_HARDWARE
         +0x000 Flush            : _HARDWARE_PTE
         +0x000 Proto            : _MMPTE_PROTOTYPE
         +0x000 Soft             : _MMPTE_SOFTWARE
         +0x000 Trans            : _MMPTE_TRANSITION
         +0x000 Subsect          : _MMPTE_SUBSECTION
         +0x000 List             : _MMPTE_LIST
   +0x014 u4               : __unnamed
      +0x000 EntireFrame      : 0
      +0x000 PteFrame         : 0y00000000000000000000000000 (0)
      +0x000 InPageError      : 0y0
      +0x000 VerifierAllocation : 0y0
      +0x000 AweAllocation    : 0y0
      +0x000 LockCharged      : 0y0
      +0x000 KernelStack      : 0y0
      +0x000 Reserved         : 0y0
windows这样做的原因我想是因为增加访问速度吧。如果把他做在一个链表里,那么如果要找到空闲的页提交上去那速度很慢的。

但是它现在划分了几块来表示不同的物理地止。他访问速度就很快了。







评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值