阅读:2019回复:14
关于页故障的问题
WINDOWS WDM书说“运行在大于等于DISPATCH_LEVEL的时候不可以引发页故障”,请问,什么是页故障???
另外,如果在一个PASSIVE_LEVEL及上的列程分配了一片非分页内存,当该例程被paged out 的时候是否会出现页故障?我这样的题法是否正确???? :( :( :( |
|
|
沙发#
发布于:2002-04-24 14:53
页故障是这样的
由于虚拟内存的缘故,系统会把当前内存中的一部分页面交换到硬盘上去,一旦需要的时候,再从硬盘上读回来,这是大家都很清楚的。 但是,在内核态的时候,由于缺页异常的处理是在dispatch级别以下,所以一旦在dispatch级别上或更高的级别上引发缺页,系统无法处理这个异常,因为级别不够,所以产生缺页错误。 在PASSIVE_LEVEL上不会引发缺页错误,因为它的级别低 |
|
|
板凳#
发布于:2002-04-24 15:01
zydcat is right !
补充一点,在PASSIVE_LEVEL分配的非分页内存,可以在DISPATCH_LEVEL被引用而不会引发页故障,因为NonPaged 内存被锁定在物理内存中,不会被交换出去。ExAllocatePool分配的是堆内存,而不是栈内存,所以即使离开函数体,内存也不会被释放,直到ExFreePool被调用。 |
|
|
地板#
发布于:2002-04-24 15:17
先感谢2位的辛苦回答!
那么,到底什么是导致页故障的原因呢?除了缺页之外还有其它的吗?哪里能有比较详细的阐述这个问题的资料 PROGRAM WDM 警告不要在DISPATCH――LEVEL级上导致页故障(说实话,我也很不愿意),可我如何才能不导致页故障呢? 再辛苦一下了,感谢感谢~~ :( :( :( |
|
|
地下室#
发布于:2002-04-24 15:27
还有,这个函数IoGetCurrentProcess的解释中说Callers of IoGetCurrentProcess must be running at IRQL PASSIVE_LEVEL.
,那么,如果我在一个非PASSIVE_LEVEL上来调用这个函数是不是就要产生页故障?? 用__try { ... IoGetCurrentProcess() .. } __except( 1 ) { } 这样的结构化异常能否捕获这样的错误??如果不能,难道只有看着已经被我重起动了100000XXXXX次的机器再次重启动吗? 给点建议吧,我实在不想看到BSOD了! :( :( :( |
|
|
5楼#
发布于:2002-04-24 15:34
要注意几点:
1、非法指针,这个最简单。 2、驱动程序中最好使用非分页内存。 3、内核例程几乎都有调用的级别。如ZwXXX只能在PASSIVE_LEVEL调用。这个最复杂,也很容易出错且不好查。这就需要仔细看DDK文挡,经验也很重要。 |
|
|
6楼#
发布于:2002-04-24 15:36
避免缺页错误的方法当然是在dispatch级别上不要引用非分页内存了
尤其是在中断例程里。 捕获缺页错误我也不太清楚,你可以试一下 或者看看tom_lyd老兄有什么好的方法 |
|
|
7楼#
发布于:2002-04-24 15:45
有些例程,比如ZwCreateFile在DISPATCH_LEVEL调用也不会产生页错误,只是不会成功。因此在非PASSIVE_LEVEL调用IoGetCurrentProcess() 也不一定产生页错误。
在高于PASSIVE_LEVEL调用PASSIVE_LEVEL例程可以用工作线程。 |
|
|
8楼#
发布于:2002-04-24 16:06
各位DX,我想请问一下,在driver中用static分配的变量是什么类型的内存? 分页or非分页内存?
那么Global变量以及普通变量都是什么内存? 谢谢! |
|
9楼#
发布于:2002-04-24 16:45
是分页内存
|
|
|
10楼#
发布于:2002-04-24 18:20
驱动程序仍然是PE文件,所有的全局、静态变量在.data、.bss等区,加载进内存后可不可分页要看你设的DataSeg属性了,一般设为可分页的;局部变量在12k大小(x86)的内核栈,一般不可分页
|
|
11楼#
发布于:2002-04-24 20:58
是分页内存 why ? |
|
|
12楼#
发布于:2002-04-24 22:08
没有深究过,感觉是,呵呵
|
|
|
13楼#
发布于:2002-04-25 11:16
要想不产生缺页故障,就在DISPATCH_LEVEL和更高的级别中使用非分页内存。如果使用DISPATCH_LEVEL和更高的级别中使用分页内存,就产生缺页故障,内核会崩溃,而不是在PASSIVE_LEVEL中产生所谓的缺页错误,只将线程阻塞,将页掉入内存。我估计windows的页管理程序运行在DISPATCH_LEVEL
|
|
14楼#
发布于:2002-04-25 11:26
错,应该是在APC_LEVEL级上。
|
|
|