PagedPool 和 NoPagedPool的区别

摘自胡文亮Win64驱动编程基础


PoolTypeMSDN的介绍上有 N 种, 其实常用的只有 2 种:
PagedPool NonPagedPoolPagedPool是分页内存,简单来说就是物理内存不够时,会把这片内存移动到硬盘上,而NonPagedPool是无论物理内存如何紧缺,都绝对不把这片内存的内容移动到硬盘上。 在往下讲之前,先补充一个知识, 就是我们操作的内存,都是虚拟内存,和物理内存是两码事。 但虚拟内存的数据是放在物理内存上的,两者存在映射关系, 一般来说,一片物理内存可以映射为多片虚拟内存, 但一片虚拟内存必定只对应一片物理内存。 假设虚拟内存是 0Xfffff80001234567 在物理内存的地址是 0x123456, 当物理内存不够用时, 物理内存0x123456的原始内容就挪到硬盘上,然后把另外一片急需要用的内容移到物理内存里。 此时, 当你再读取 0Xfffff80001234567 的内容时,就会引发缺页异常, 系统就会把在硬盘上的内容再次放到物理内存中(如果这个过程失败,一般就死机了)。 

以上说了这么多废话,总结两句:1.NonPagedPool的总量是有限的( 具体大小和你物理内存的大小相关), 而PagedPool的总量较多。申请了内存忘记释放都会造成内存泄漏,但是很明显忘记释放NonPagedPool的后果要严重得多;2.一般来说,PagedPool用来放数据(比如你用ZwQuerySystemInformation枚举内核模块,可以申请一大片PagedPool存放返回的数据),而NonPagedPool用来放代码(你写内核shellcode并需要执行时, 必须使用NonPagedPool存放shellcode)。 以我的经验来说,访问到切换出去的内存没事,但是执行到切换出去的内存必然蓝屏( 这只是我的经验,正确性待定)。3.在用户态,内存是有属性的, 有的内存片只 能 读 不 能 写 不 能 执 行 (PAGE_READ), 有 的 内 存 片 可 以 读 可 以 写 也 可 以 执 行(PAGE_READ_WRITE_EXECUTE)。 在内核里,PagedPoolNonPagedPool都是可读可写可执行的, 而且没有类似VirtualProtect之类的函数。 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值