也看了一些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这样做的原因我想是因为增加访问速度吧。如果把他做在一个链表里,那么如果要找到空闲的页提交上去那速度很慢的。
但是它现在划分了几块来表示不同的物理地止。他访问速度就很快了。