阅读:2328回复:3
分页内存与非分页内存的疑惑
张帆在《驱动详解》中讲到:
当程序的中断请求级在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操作, } 请高手帮我解答一下啊,谢谢 |
|
沙发#
发布于:2012-12-25 14:41
你应该了解一下这种情况蓝屏的原因,蓝屏是因为分页内存可能存在于pagefile里,也就是说,这块内存只有虚拟空间,没有物理空间,在PASSIVE_LEVEL情况下,如果访问分页内存,系统会从给你分配物理内存,并从pagefile里把内存数据读出来,这是在DISPATCH_LEVEL干的。如果你的代码运行于DISPATCH_LEVEL,那系统就没法干这个事情,只能蓝屏。
这并不意味着PAGEDCODE就一定蓝,如果你在DISPATCH_LEVEL运行PAGEDCODE代码,而这段代码恰好位于物理内存里,那是不会蓝屏的。等着被置换出去后,你再运行,才会蓝屏。 你的疑问2的答案也是一样,如果ExAllocatePool里访问的数据都在物理内存中,那就算是pagepool内存,也不会蓝屏。 |
|
板凳#
发布于:2012-12-25 14:47
补充一下:page和nonpage的区别就是page可能没有物理内存,可能已经被置换出去,nonpage肯定有物理内存。当page分配有物理内存的时候,跟nonpage是没有区别的。
|
|
地板#
发布于:2012-12-26 11:53
恩恩,谢谢楼主的分享哦,顶个
|
|
|