内存管理(2)系统空间的内存管理算法

系统空间的内存管理算法:

仅列出关键结构和逻辑,代码神码的是各种繁琐额。。。

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

<
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值