您的位置:首页 > 其它

windows内存管理之雾里探花

2012-06-05 09:53 525 查看
也看了一些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这样做的原因我想是因为增加访问速度吧。如果把他做在一个链表里,那么如果要找到空闲的页提交上去那速度很慢的。

但是它现在划分了几块来表示不同的物理地止。他访问速度就很快了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息