Re: 一起来探讨个有意思的问题

Windows内核调试

一起来探讨个有意思的问题


kkindof 2013-08-20, 16:41 下午
关于IRQL

在XP上raise irql的时候,只是把irql写到apic寄存器中(映射到0FFFE0080h,对这个地址的写会引发中断),并没用到pcr->irql字段(求证)

而WIN7,WIN8在raise的时候就使用到了pcr->irql这个字段
这里就引出一个问题:
pcr是CPU相关的,如果线程A提升到apc_level后,被线程B抢占进来,此时的pcr->irql还是保存着apc_level吗?
如果不是,在线程B切进来的时候怎么保证pcr->irql是正确的值??


对于APC来说,APC应该是线程相关的,而MS文档上提到raise irql提升到APC LEVEL可以禁止APC deliver(包括special kernel apc)
但由于raise irql 只是修改当前cpu的,而线程是有可能切换任意procesor上运行,这样的话,那怎么禁止apc deliver呢??



Re: 一起来探讨个有意思的问题


格蠹老雷 2013-08-20, 22:36 下午

如果CPU已经在APC_LEVEL,那么它只可能处理比APC_LEVEL更高优先级的,DPC,中断之类的,不可能去执行线程B的。

处理中断并不切线程,中断处理好了,还是回到线程A的APC...

 

Re: 一起来探讨个有意思的问题


kkindof 2013-08-20, 22:45 下午
windows不是抢占式的吗?
APC那个线程在raise irql到apc后,时间片刚好用完,难道不会切到其它线程吗?而且线程切换是在dispatch_level下,不会因为APC_level导致不能切换

Re: 一起来探讨个有意思的问题


格蠹老雷 2013-08-22, 22:39 下午

切到哪个线程呢?因为切换的一个原则是不能切换到比自己特权级别低的,当前是APC,所以是不可能切换到普通用户态线程的

Re: 一起来探讨个有意思的问题


kkindof 2013-08-23, 10:38 上午
OK,就按上面的说法,不能换到其它低于APC level的线程,如此说来应该有线程相关的变量存放着对应的线程的irql了?否则何来比较线程A和线程B的irql?但irql又应该是processor级别的,乱了。

暂且不说上面的。

WINDOWS下是抢占式的系统,我的理解,这是靠时钟中断,然后计算线程的时间片,强制把时间片到期的线程切到等待状态,然后把NextThread切进去执行。
按张老师你的说法假如那个到期的线程(所处的cpu)是在APC级别上,然后就不切NextThread了??


感觉这里还有点混乱,Apc_level  disable apc delivery,可apc delivery是线程级别,而Apc_level算CPU级别的吧?按理解apc_level不是cpu级别的吧,只是MS抽象的一个概念。。"曾经也在OSR的帖子上说,使用fastmute提高irql到apc_level的话,需要和各个processor交互,效率不好"


理解得还不是很透彻,要是方便的话,张老师帮忙梳理下。。。



Re: 一起来探讨个有意思的问题


WillingBug163 2013-08-26, 15:06 下午
你的这个问题和CPU的中断控制器相关,提升级别的同时也在屏蔽部分中断。在64位win7里面对级别的提升操作的是CR8这个寄存器,在文档中可以看到对它的设置,会影响PPR寄存器。如果提升到APC级别那么就屏蔽了特权>=1以下的中断,2号中断正好是你所说的线程任务切换用的。如果不恢复回去那么便不会在这个处理器上进行任务切换了。这也许便是文档中强调一定要再切回原来的级别。32位CPU中没有CR8,但我没有找到它操作PCR->IRQL的代码。但想必是一样的。张老师,不知道我说的对不对。呵呵。

Re: 一起来探讨个有意思的问题


格蠹老雷 2013-08-28, 08:38 上午

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执行的。

这样的问题值得深究,但是三言两语很难说清,这几天会找个时间写篇博客,用调试的方法,再举些例子...

 

Re: 一起来探讨个有意思的问题


kkindof 2013-08-28, 10:08 上午
raymond老师出手,值得期待!!!!

Re: 一起来探讨个有意思的问题


WillingBug163 2013-08-28, 13:52 下午
期待!

Re: 一起来探讨个有意思的问题


格蠹老雷 2013-09-01, 22:14 下午
周末两天忙着写代码了,要等等,抱歉

Powered by Community Server Powered by CnForums.Net