如果CPU已经在APC_LEVEL,那么它只可能处理比APC_LEVEL更高优先级的,DPC,中断之类的,不可能去执行线程B的。
处理中断并不切线程,中断处理好了,还是回到线程A的APC...
切到哪个线程呢?因为切换的一个原则是不能切换到比自己特权级别低的,当前是APC,所以是不可能切换到普通用户态线程的
IRQL一定是CPU的属性,Svr 2K3之前,就是记录在CPU的APIC中,2K3新增软件字段,主要是为了支持调试。
CPU在执行线程时,这个线程可以提升IRQL,所以有时也就混同来说线程某某的IRQL,其实是指这个线程在CPU的某一级IRQL执行(只用IRQL为0时才是执行自己的普通代码,其它时候都是“免费提供场地”被借用来执行特殊任务去了)。
对于APC,有一点特别容易误解的地方,就是APC任务有多种类型,Kernel Special,Kernel Normal,User Normal,并不是所有这些类型的任务都是在APC_LEVEL执行的,User Normal的APC就是在PASSIVE(0)IRQL执行的。
这样的问题值得深究,但是三言两语很难说清,这几天会找个时间写篇博客,用调试的方法,再举些例子...