Windows内核情景分析学习笔记(四)

内存管理

物理内存

//申请一页物理地址并挂入到对应的链表
PFN_NUMBER MmAllocPage(ULONG ConsumerType);

首先判断FreeZeroedPageListHead链表是否为空,如果不为空则从FreeZeroedPageListHead取下一个节点,并修改该节点属性为对应类型并挂入对应的链表中,如果FreeZeroedPageListHead为空,则判断FreeUnzeroedPageListHead是否为空,如果不为空,则跟上述一样不过需要多加一步给页面清零的操作,如果两个链表都为空则表明没有足够的物理内存返回NULL

//申请物理页 根据是否愿意进行等待进行处理
NTSTATUS MmRequestPageMemoryConsumer(ULONG consumer,BOOLEAN CanWait, PFN* pfn)

首先取得对应consumer链表中已经获取到的页面数,如果大于等于该类型页面的最大数量-1,则需要根据是否愿意进行等待进行处理,如果不愿意进行等待则直接返回NULL,如果愿意进行等待则调用修剪函数对该类型页面进行修剪。然后如果申请的类型为非分页内存或者当前线程为平衡页面数量的线程,则直接调用MmAllocPage得到物理内存,如果不能得到则蓝屏,如果得到了且当前剩余可用物理页面低于最小设定值,则唤醒内核线程MiBalanceThread进行修剪然后返回。如果类型不为非分页内存且所剩物理页面小于最小值,如果不愿意等待则直接返回NULL,愿意等待咋唤醒内核线程MiBalanceThread进行修剪,将自己的申请页面请求插入到等待页面链表,等待请求被答复。如果没有以上的情况,一般就是调用MmAllocPage获得物理内存。

//释放指定的物理页
NTSTATUS  MmReleasePageMemory(consumer, pfn)

如果不存在等待页面请求,则把该页面对应的节点插入到FreeUnzeroedPageList 链表中,如果有请求则响应该请求。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值