Windows内核的IRQL 中断请求级别

IRQL == Interrupt ReQuest Level 中断请求级别

中断上下文,系统代替硬件做一些事情,不可睡眠

进程上下文,系统代替进程做一些事情

内部中断:CPU内部引起的叫陷阱,异常

外部中断:


Windows内核的IRQL 中断请求级别


无中断:

PASSIVE_LEVEL(0) 常规线程执行

{

DriverEntry

DriverUnload

Dispatch

PsCreateThread

可以使用任何函数和内存

}

软中断:

APC_LEVEL(1) 异步过程调用执行

{

APC线程

}

DISPATCH_LEVEL(2) 线程调度,延时过程调用执行

{

完成例程

NDIS回调函数

只能访问运行在DISPATCH级别的API和非分页内存

自旋锁Request后会升级费DIspatch_LEVEL

}

硬中断:

DIRQL 设备中断请求级处理程序执行

PROFILE_LEVEL 配置文件定时器

CLOCK2_LEVEL 时钟

SYNCH_LEVEL 同步级

IPI_LEVEL 处理器之间中断级

POWER_LEVEL 电源故障级

中断函数执行要快速执行,否则会出问题

NONPAGEPOOL内存可以在任何级别使用

PAGEDPOOL只能在PASSIVE_LEVEL和APC_LEVEL使用

PASSIVE和PAC级别判断:

#define PAGED_CODE() \\

{ if (KeGetCurrentIrql() > APC_LEVEL) {

kdPrint(("EX:Pageable code called at IRQL %d\\n",

KegetCurrentIrql())) ;\\

ASSERT(FALSE); \\

} \\

}


分享到:


相關文章: