IRQL

IRQL是Interrupt ReQuest Level,中断请求级别。windows

一个由windows虚拟出来的概念,划分在windows下中断的优先级,这里中断包括了硬中断和软中断,硬中断是由硬件产生,而软中断则是彻底虚拟出来的。
处理器在一个IRQL上执行线程代码。IRQL用于帮助决定线程如何被中断的。在同一处理器上,线程只能被更高级别IRQL的线程能中断。每一个处理器都有本身的中断IRQL。

IRQL级别:
PASSIVE_LEVEL
IRQL最低级别,没有被屏蔽的中断,在这个级别上,线程执行用户模式,能够访问分页内存。
APC_LEVEL
在这个级别上,只有APC级别的中断被屏蔽,能够访问分页内存。当有APC发生时,处理器提高到APC级别,这样,就屏蔽掉其它APC,为了和APC执行一些同步,驱动程序能够手动提高到这个级别。好比,若是提高到这个级别,APC就不能调用。在这个级别,APC被禁止了,致使禁止一些I/O完成APC,因此有一些API不能调用。
DISPATCH_LEVEL
这个级别,DPC 和更低的中断被屏蔽,不能访问分页内存,全部的被访问的内存不能分页。由于只能处理分页内存,因此在这个级别,可以访问的Api大大减小。
DIRQL (Device IRQL)
通常的,更高级的驱动在这个级别上不处理IRQL,可是几乎全部的中断被屏蔽,这其实是IRQL的一个范围,这是一个决定某个驱动有更高的优先级的方法。网络

 

 

分页内存和非分页内存
分页内存和非分页内存与IRQL的关系密切
分页内存是低中断级别的例程能够访问的。
非分页内存则是各个中断级别的例程均可以使用的。函数

DDK中的API函数的Requirements里基本都会给出该函数执行要求的IRQL级别(即在小于或等于某一IRQL级别上运行)。ui

 

区别
分页内存是虚拟内存,在物理上未必老是能获得。
操做系统实现虚拟内存的主要方法就是经过分页机制。首先要明确,在Win32中,物理地址空间,二维虚拟地址空间和实际内存地址是三个不一样的概念。操作系统

操做系统经过段选择子构成二维虚拟地址空间,每一个进程有一个4G的地址空间,而后操做系统的内存管理器件把每一个进程映射到一维物理地址空间的不一样部分,可是由于咱们实际机器上大都没有4G内存,因此,实际内存空间是物理地址空间的子集。线程

分页管理器把地址空间划分红4K大小的页面(非Intel X86体系与之不一样),当进程访问某个页面时,操做系统首先在Cache中查找页面,若是该页面不在内存中,则产生一个缺页中断(Page Fault),进程就会被阻塞,直至要访问的页面从外存调入内存中。进程

咱们知道,在处理低优先级的中断时,仍能够发生高优先级的中断。既然缺页过程也是一个中断过程,那么就产生一个问题,即,缺页中断和其余中断的优先级的问题。若是在高于缺页中断的中断优先级上再发生缺页中断,内核就会崩溃。因此在DISPATCH_LEVEL级别以上,绝对不能使用分页内存,一旦使用分页内存,就有发生缺页中断的可能,前面说过,这样会致使内核崩溃。内存

 

部分知识整理自网络rem

相关文章
相关标签/搜索