guanlaiy
驱动牛犊
驱动牛犊
  • 注册日期2012-12-25
  • 最后登录2012-12-25
  • 粉丝0
  • 关注0
  • 积分3分
  • 威望21点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:2238回复:3

分页内存与非分页内存的疑惑

楼主#
更多 发布于:2012-12-25 10:33
张帆在《驱动详解》中讲到:
当程序的中断请求级在DISPATCH_LEVEL之上时(包括DISPATCH_LEVEL层),程序只能使用非分页内存,否则将导致蓝屏死机。
我的疑问是:
疑问1.代码本身是只能被加载到非分页内存?
假设例程void somefun()总是运行在DISPATCH_LEVEL时,那么是否在例程前只能用#pragma LOCKEDCODE,如:
#pragma LOCKEDCODE
void somefun()
{
    ...
}
但在实际调试时,我用下面方式定义,并没有蓝屏死机,请问为什么?
#pragma PAGEDCODE
void somefun()
{
    ...
}


疑问2.代码内部分配内存时是否只能分配非分页内存?
假设例程void somefun()总是运行在DISPATCH_LEVEL时,在例程内部分配分页内存,编写如下,在实际调试中怎么不蓝屏死机?
#pragma LOCKEDCODE
void somefun()
{
      PVOID pTmp = ExAllocatePool(PagePool, 1024);
     ... //对pTmp操作,
}

请高手帮我解答一下啊,谢谢
ITSailor
驱动牛犊
驱动牛犊
  • 注册日期2010-12-08
  • 最后登录2014-05-05
  • 粉丝2
  • 关注0
  • 积分29分
  • 威望291点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分1分
沙发#
发布于:2012-12-25 14:41
你应该了解一下这种情况蓝屏的原因,蓝屏是因为分页内存可能存在于pagefile里,也就是说,这块内存只有虚拟空间,没有物理空间,在PASSIVE_LEVEL情况下,如果访问分页内存,系统会从给你分配物理内存,并从pagefile里把内存数据读出来,这是在DISPATCH_LEVEL干的。如果你的代码运行于DISPATCH_LEVEL,那系统就没法干这个事情,只能蓝屏。

这并不意味着PAGEDCODE就一定蓝,如果你在DISPATCH_LEVEL运行PAGEDCODE代码,而这段代码恰好位于物理内存里,那是不会蓝屏的。等着被置换出去后,你再运行,才会蓝屏。

你的疑问2的答案也是一样,如果ExAllocatePool里访问的数据都在物理内存中,那就算是pagepool内存,也不会蓝屏。
ITSailor
驱动牛犊
驱动牛犊
  • 注册日期2010-12-08
  • 最后登录2014-05-05
  • 粉丝2
  • 关注0
  • 积分29分
  • 威望291点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分1分
板凳#
发布于:2012-12-25 14:47
补充一下:page和nonpage的区别就是page可能没有物理内存,可能已经被置换出去,nonpage肯定有物理内存。当page分配有物理内存的时候,跟nonpage是没有区别的。
genwen111
驱动牛犊
驱动牛犊
  • 注册日期2012-12-26
  • 最后登录2012-12-26
  • 粉丝0
  • 关注0
  • 积分2分
  • 威望21点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2012-12-26 11:53
恩恩,谢谢楼主的分享哦,顶个
www.0827rc.com www.bc066.com www.quanxun08.com
游客

返回顶部