wlrwx
驱动小牛
驱动小牛
  • 注册日期2002-04-05
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分11分
  • 威望11点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
阅读:2019回复:14

关于页故障的问题

楼主#
更多 发布于:2002-04-24 14:39
WINDOWS WDM书说“运行在大于等于DISPATCH_LEVEL的时候不可以引发页故障”,请问,什么是页故障???

另外,如果在一个PASSIVE_LEVEL及上的列程分配了一片非分页内存,当该例程被paged out 的时候是否会出现页故障?我这样的题法是否正确????
 :( :( :(
真正的浪子―――― 是掠过城市的微风,每个人都能感到他的清新,可没有人能留住...... 亦是划过天际的流星,所有人都能仰望他夺目的光芒,没有人能触及...... 风止于森林,流星损于黄土......非凡浪子归于他的最爱......
zydcat
驱动老牛
驱动老牛
  • 注册日期2001-12-06
  • 最后登录2006-04-12
  • 粉丝0
  • 关注0
  • 积分9分
  • 威望2点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2002-04-24 14:53
页故障是这样的
由于虚拟内存的缘故,系统会把当前内存中的一部分页面交换到硬盘上去,一旦需要的时候,再从硬盘上读回来,这是大家都很清楚的。
但是,在内核态的时候,由于缺页异常的处理是在dispatch级别以下,所以一旦在dispatch级别上或更高的级别上引发缺页,系统无法处理这个异常,因为级别不够,所以产生缺页错误。

在PASSIVE_LEVEL上不会引发缺页错误,因为它的级别低
[color=red]肥虫虫[/color] [img]http://www.driverdevelop.com/forum/upload/bradley/2002-11-15_ig01.gif[/img]
Tom_lyd
驱动大牛
驱动大牛
  • 注册日期2001-09-02
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望1点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2002-04-24 15:01
zydcat is right !
补充一点,在PASSIVE_LEVEL分配的非分页内存,可以在DISPATCH_LEVEL被引用而不会引发页故障,因为NonPaged 内存被锁定在物理内存中,不会被交换出去。ExAllocatePool分配的是堆内存,而不是栈内存,所以即使离开函数体,内存也不会被释放,直到ExFreePool被调用。
Tom_lyd
wlrwx
驱动小牛
驱动小牛
  • 注册日期2002-04-05
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分11分
  • 威望11点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
地板#
发布于:2002-04-24 15:17
先感谢2位的辛苦回答!

那么,到底什么是导致页故障的原因呢?除了缺页之外还有其它的吗?哪里能有比较详细的阐述这个问题的资料

PROGRAM WDM 警告不要在DISPATCH――LEVEL级上导致页故障(说实话,我也很不愿意),可我如何才能不导致页故障呢?

再辛苦一下了,感谢感谢~~

 :( :( :(
真正的浪子―――― 是掠过城市的微风,每个人都能感到他的清新,可没有人能留住...... 亦是划过天际的流星,所有人都能仰望他夺目的光芒,没有人能触及...... 风止于森林,流星损于黄土......非凡浪子归于他的最爱......
wlrwx
驱动小牛
驱动小牛
  • 注册日期2002-04-05
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分11分
  • 威望11点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2002-04-24 15:27
还有,这个函数IoGetCurrentProcess的解释中说Callers of IoGetCurrentProcess must be running at IRQL PASSIVE_LEVEL.

,那么,如果我在一个非PASSIVE_LEVEL上来调用这个函数是不是就要产生页故障??
用__try
{
...
IoGetCurrentProcess()
..
}
__except( 1 )
{
}
这样的结构化异常能否捕获这样的错误??如果不能,难道只有看着已经被我重起动了100000XXXXX次的机器再次重启动吗?

给点建议吧,我实在不想看到BSOD了!
 :( :( :(
真正的浪子―――― 是掠过城市的微风,每个人都能感到他的清新,可没有人能留住...... 亦是划过天际的流星,所有人都能仰望他夺目的光芒,没有人能触及...... 风止于森林,流星损于黄土......非凡浪子归于他的最爱......
tigerzd
驱动老牛
驱动老牛
  • 注册日期2001-08-25
  • 最后登录2004-12-13
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2002-04-24 15:34
要注意几点:
1、非法指针,这个最简单。
2、驱动程序中最好使用非分页内存。
3、内核例程几乎都有调用的级别。如ZwXXX只能在PASSIVE_LEVEL调用。这个最复杂,也很容易出错且不好查。这就需要仔细看DDK文挡,经验也很重要。
犯强汉者,虽远必诛! [img]http://www.driverdevelop.com/forum/upload/tigerzd/2002-12-13_sf10.JPG[/img]
zydcat
驱动老牛
驱动老牛
  • 注册日期2001-12-06
  • 最后登录2006-04-12
  • 粉丝0
  • 关注0
  • 积分9分
  • 威望2点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2002-04-24 15:36
避免缺页错误的方法当然是在dispatch级别上不要引用非分页内存了
尤其是在中断例程里。
捕获缺页错误我也不太清楚,你可以试一下
或者看看tom_lyd老兄有什么好的方法
[color=red]肥虫虫[/color] [img]http://www.driverdevelop.com/forum/upload/bradley/2002-11-15_ig01.gif[/img]
tigerzd
驱动老牛
驱动老牛
  • 注册日期2001-08-25
  • 最后登录2004-12-13
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2002-04-24 15:45
有些例程,比如ZwCreateFile在DISPATCH_LEVEL调用也不会产生页错误,只是不会成功。因此在非PASSIVE_LEVEL调用IoGetCurrentProcess() 也不一定产生页错误。
在高于PASSIVE_LEVEL调用PASSIVE_LEVEL例程可以用工作线程。
犯强汉者,虽远必诛! [img]http://www.driverdevelop.com/forum/upload/tigerzd/2002-12-13_sf10.JPG[/img]
sam_h
驱动牛犊
驱动牛犊
  • 注册日期2001-04-19
  • 最后登录2012-01-25
  • 粉丝0
  • 关注0
  • 积分5分
  • 威望3点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2002-04-24 16:06
各位DX,我想请问一下,在driver中用static分配的变量是什么类型的内存? 分页or非分页内存?

那么Global变量以及普通变量都是什么内存?
谢谢!
zydcat
驱动老牛
驱动老牛
  • 注册日期2001-12-06
  • 最后登录2006-04-12
  • 粉丝0
  • 关注0
  • 积分9分
  • 威望2点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2002-04-24 16:45
是分页内存
[color=red]肥虫虫[/color] [img]http://www.driverdevelop.com/forum/upload/bradley/2002-11-15_ig01.gif[/img]
pjf
pjf
驱动中牛
驱动中牛
  • 注册日期2001-07-08
  • 最后登录2006-10-23
  • 粉丝0
  • 关注0
  • 积分42分
  • 威望4点
  • 贡献值0点
  • 好评度4点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2002-04-24 18:20
驱动程序仍然是PE文件,所有的全局、静态变量在.data、.bss等区,加载进内存后可不可分页要看你设的DataSeg属性了,一般设为可分页的;局部变量在12k大小(x86)的内核栈,一般不可分页
Tom_lyd
驱动大牛
驱动大牛
  • 注册日期2001-09-02
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望1点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
11楼#
发布于:2002-04-24 20:58
是分页内存

why ?
Tom_lyd
zydcat
驱动老牛
驱动老牛
  • 注册日期2001-12-06
  • 最后登录2006-04-12
  • 粉丝0
  • 关注0
  • 积分9分
  • 威望2点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
12楼#
发布于:2002-04-24 22:08
没有深究过,感觉是,呵呵
[color=red]肥虫虫[/color] [img]http://www.driverdevelop.com/forum/upload/bradley/2002-11-15_ig01.gif[/img]
du_lin
驱动小牛
驱动小牛
  • 注册日期2002-01-26
  • 最后登录2005-08-22
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
13楼#
发布于:2002-04-25 11:16
要想不产生缺页故障,就在DISPATCH_LEVEL和更高的级别中使用非分页内存。如果使用DISPATCH_LEVEL和更高的级别中使用分页内存,就产生缺页故障,内核会崩溃,而不是在PASSIVE_LEVEL中产生所谓的缺页错误,只将线程阻塞,将页掉入内存。我估计windows的页管理程序运行在DISPATCH_LEVEL
zydcat
驱动老牛
驱动老牛
  • 注册日期2001-12-06
  • 最后登录2006-04-12
  • 粉丝0
  • 关注0
  • 积分9分
  • 威望2点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
14楼#
发布于:2002-04-25 11:26
错,应该是在APC_LEVEL级上。
[color=red]肥虫虫[/color] [img]http://www.driverdevelop.com/forum/upload/bradley/2002-11-15_ig01.gif[/img]
游客

返回顶部