IRQ-介绍
IRQ全称为Interrupt Request,即是“中断请求”的意思。IRQ的作用就是在我们所用的电脑中,执行硬件中断请求的动作,用来停止其相关硬件的工作状态,比如我们在打印一份图片,在打印结束时就需要由系统对打印机提出相应的中断请求,来以此结束这个打印的操作。在每台电脑的系统中,是由一个中断控制器8259或是8259A的芯片(现在此芯片大都集成到其它的芯片内)来控制系统中每个硬件的中断控制。目前共有16组IRQ,去掉其中用来作桥接的一组IRQ,实际上只有15组IRQ可供硬件调用。
IRQ主要是就外部设备而言的。声卡、调制解调器等外部设备,在一般情况下并不使用,也就是说,不占用CPU的工作时间。当我们播放声音文件、上网时,声卡、调制解调器就会向 CPU发出申请,要求CPU分配一些工作时间给它们。但这时往往 CPU正在进行其他工作,怎么办呢?这时“中断”就起作用了。
CPU会给发出中断申请的外部设备一个中断号,也就是IRQ号码,以后这个外部设备就使用这个中断号来工作,一旦有工作要求,CPU就会响应,暂时拿出一段时间为这个外部设备工作。IRQ号码是分等级的,而且CPU一次只能响应一个中断请求,如果有好几个设备不小心使用了同一个IRQ号码,系统就会出现问题。在DOS下声卡不能发声,多半就是IRQ号码分配得不对造成的。在Windows系统里,系统会自动为外部设备分配IRQ号,如果有冲突会自己进行调整,尽量满足要求,实在不行才会发出警告。
IRQL- 概念
IRQL是Interrupt ReQuest Level,中断请求级别。一个由windows虚拟出来的概念,划分在windows下中断的优先级,这里中断包括了硬中断和软中断,硬中断是由硬件产生,而软中断则是完全虚拟出来的。处理器在一个IRQL上执行线程代码。IRQL是帮助决定线程如何被中断的。在同一处理器上,线程只能被更高级别IRQL的线程能中断。每个处理器都有自己的中断IRQL。我们在调用NDIS API时,在DDK帮助文档中都有该API函数的所在级别。
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的一个范围,这是一个决定某个驱动有更高的优先级的方法。
分页池和非分页池
1 页面一直锁定在物理内存中,不会被换出到页面交换文件中
2 Windows把虚拟地址分为用户地址空间和系统地址空间,用户地址空间是给应用程序使用的,系统地址空间是给系统核心和驱动程序使用的。系统地址空间分为分页池和非分页池,分页池是指映射到分页文件的虚拟地址,当要使用该地址时才交换到物理内存中,由系统来调度;非分页池是指直接在物理内存中分配的内存。“页面缓冲池”就是进程占用的分页池中的虚拟内存,是进程调用某些系统功能时,由系统核心或者驱动程序分配的。如果一个程序占用的页面缓冲池内存不断增大,就是内存泄露,通常应该是创建或打开了句柄没有关闭。