系统空间的内存管理算法:
仅列出关键结构和逻辑,代码神码的是各种繁琐额。。。
1 非换页内存池管理算法
非换页内存池 一个是MmNonPagedPoolStart这个是已经申请好物理内存的,另外还有一个MmNonPagedPoolExpansionStart作为扩展的区域,只有在内存不够时采取分配
申请和释放的操作,是MiAllocatePoolPages 和 MiFreePoolPages
MmNonPagedPoolFreeListHead是一个数组 有4项 每一项对应一个_MMFREE_POOL_ENTRY的链表
此外MiNonPagedPoolSListHead是单一内存页的缓存区
仅列出关键结构和逻辑,代码神码的是各种繁琐额。。。
1 非换页内存池管理算法
非换页内存池 一个是MmNonPagedPoolStart这个是已经申请好物理内存的,另外还有一个MmNonPagedPoolExpansionStart作为扩展的区域,只有在内存不够时采取分配
申请和释放的操作,是MiAllocatePoolPages 和 MiFreePoolPages
MmNonPagedPoolFreeListHead是一个数组 有4项 每一项对应一个_MMFREE_POOL_ENTRY的链表
typedef struct _MMFREE_POOL_ENTRY {
LIST_ENTRY List;
PFN_NUMBER Size; //连续页面的大小
ULONG Signature;
struct _MMFREE_POOL_ENTRY *Owner; //指向内存块的第一个页面
} MMFREE_POOL_ENTRY, *PMMFREE_POOL_ENTRY;
一块内存块的起始和结束可以直接标志在PFN数据库之中。
kd> dd MmNonPagedPoolFreeListHead
8089ffc0 814b5000 814b5000 812b7000 812fb000
8089ffd0 8089ffd0 8089ffd0 814a0000 8155a000
kd> dt _MMFREE_POOL_ENTRY 814b5000
nt!_MMFREE_POOL_ENTRY
+0x000 List : _LIST_ENTRY [ 0x8089ffc0 - 0x8089ffc0 ]
+0x008 Size : 1
+0x00c Signature : 0
+0x010 Owner : 0x814b5000 _MMFREE_POOL_ENTRY
kd> dt _MMFREE_POOL_ENTRY 812b7000
nt!_MMFREE_POOL_ENTRY
+0x000 List : _LIST_ENTRY [ 0x816f7000 - 0x8089ffc8 ]
+0x008 Size : 2
+0x00c Signature : 0
+0x010 Owner : 0x812b7000 _MMFREE_POOL_ENTRY
此外MiNonPagedPoolSListHead是单一内存页的缓存区
注 链表的地址就是这个页面的基址。。刚才蹬着这个结构半天在想这个页面该去哪找= =
2换页内存池管理算法
系统全局内存池和会话空间内存池
换页池用位图来进行管理。
描述内存池信息的结构,系统全局的是MmPagedPoolInfo
会话空间的是MmSessionSpace中的_MM_SESSION_SPACE +0xde0 PagedPoolInfo : _MM_PAGED_POOL_INFO
<