大家好,欢迎来到IT知识分享网。
介绍:
中断请求(IRQ,Interrupt Request)一般有两种,一种是外部中断,也就是硬件产生的中断(例如:键盘中断、打印机中断、定时器中断):另一种是由软件指令 int n 产生的中断(例如:INT 3 断点中断、INT 1 单步中断)。后来 Windows 将中断进行的扩展,提出一个中断请求级(IQRL)的概念。其中规定了 32个中断请求级别,分别是 0-2 级别为软件中断,3-31 为硬件中断。
Windows IRQL的宏定义
对于驱动编程,我们通常只会接触到 0 到 2 的 IRQL 以及 DIRQL。
PASSIVE_LEVEL 0:
APC_LEVEL 1 :
在这个级别上,只有处于APC级别的中断被屏蔽,可以访问分页内存。当有APC发生时,处理器提升到APC级别,这样,就屏蔽掉其他的APC,为了和APC执行一些同步,驱动程序可以手动提升到这个级别。APC级别仅仅比PASSIVE_LEVEL高,这也是在一个线程中插入一个APC可以打断该线程(如果该线程运行在PASSIVE_LEVEL上)运行的原因。
DISPATCH_LEVEL 2:
DISPATCH_LEVEL是一个重要的区分点,它代表了线程调度器正在运行。一个处理器运行运行在IRQL上,代表他可能正在做两件事之一:正在进行线程调度;正在处理硬件中断的后半部(不那么重要的部分),这个被称为DPC(Deferred Procedure Call:延迟调用)。这个级别,DPC(延迟过程)和更低的中断被屏蔽,不能访问分页内存,所有的被访问的内存不能分页。因为只能处理非分页内存,所有在这个级别上,能够访问的Api大大减少。
线程优先级和 IRQL
IRQL 与分页内存
当 IRQL< DISPATCH_LEVEL v1 内存申请成功
当 IRQL 提升到 DISPATCH_LEVEL 申请分页内存,导致系统蓝屏
错误码:IRQL_NOT_LESS_OR_EQUAL
蓝屏原因:缺页中断机制是运行在 DISPATCH_LEVEL 级别下的,和当前代码处于一个级别,当代码访问到一个内存页在换页文件的时候,缺页机制无法打断当前代码的运行,从而无法进行页交换,导致访问到了一个错误的内存地址,进而蓝屏。
IRQL 的提升和降低
下面代码演示了驱动中如何提升和降低IRQL的代码
VOID RaiseIRQL_Test() { KIRQL oldirql; // 确保当前IRQL等于或小于DISPATCH_LEVEL ASSERT(KeGetCurrentIrql() <= DIPATCH_LEVEL); // 提升IRQL到DISPATCH_LEVEL,并将先前的IRQL保存起来 KeRaiseIrql(DISPATCH_LEVEL, &oldirql); //... // 恢复到先前的IRQL KeLowerIrql(oldirql); }
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://haidsoft.com/130454.html