本博文由CSDN博主zuishikonghuan所作,版权归zuishikonghuan所有,转载请注明出处:http://blog.csdn.net/zuishikonghuan/article/details/51062287
“中断”是一个非常重要的概念,在 80x86 的设备上,Windows 引入了“中断请求级”(IRQL)这一个概念,(在 x86 平台)其中0-2为软件中断,3-31为硬件中断。其中,软件中断从低到高(0,1,2)分别为: IRQL PASSIVE_LEVEL、IRQL APC_LEVEL 、IRQL DISPATCH_LEVEL。
中断请求级高的中断可以打断当前处于较低中断请求级的线程的工作。请注意,中断请求级和线程优先级是两个不同的概念。线程优先级是让操作系统进行线程调度的,换句话说,是用来操作系统决定如何分配给各个线程分配的时间片段的长度等。而中断请求级是用来让操作系统决定判断是否需要在某个中断出现时打断当前的工作的。
举个例子,系统调度两个线程,系统会优先调度线程优先级高的线程,线程是用户模式的线程,CPU 在执行这个线程时,处于最低的中断请求级,这时候一个中断出现了,它的中断请求级为 0x0C(假设,下同),CPU 会去执行这个中断,假设这个时候出现了一个中断请求级为 0x09 的中断,那么 CPU 不会去理睬这个中断,等到0x0C的中断处理完毕后,CPU 才会执行 0x09 的中断,执行完毕后恢复到原来的线程,如果这时候还有同样优先级的线程,操作系统通过调度使这两个线程“并行执行”,当这个线程执行完毕后,系统去调度更低优先级的线程。
驱动程序可以提升/降低中断请求级,通过调用 KeRaiseIrql/KeLowerIrql 内核函数。驱动程序还可以通过 KeGetCurrentIrql 函数得到当前中断请求级。
另外,中断请求级和