|
|
|
|
|
|
|
Windows内核调试
帖子发起人: kkindof 发起时间: 2013-08-20 16:41 下午 回复: 9
|
帖子排序:
|
|
|
|
2013-08-20, 16:41 下午
|
kkindof
注册: 2011-11-10
发 贴: 15
|
|
|
关于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呢??
|
|
|
IP 地址: 已记录
|
报告
|
|
|
|
2013-08-20, 22:36 下午
|
格蠹老雷
注册: 2005-12-19
发 贴: 1,303
|
|
|
如果CPU已经在APC_LEVEL,那么它只可能处理比APC_LEVEL更高优先级的,DPC,中断之类的,不可能去执行线程B的。
处理中断并不切线程,中断处理好了,还是回到线程A的APC...
|
|
|
IP 地址: 已记录
|
报告
|
|
|
|
2013-08-23, 10:38 上午
|
kkindof
注册: 2011-11-10
发 贴: 15
|
|
|
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交互,效率不好"
理解得还不是很透彻,要是方便的话,张老师帮忙梳理下。。。
|
|
|
IP 地址: 已记录
|
报告
|
|
|
|
2013-08-26, 15:06 下午
|
WillingBug163
注册: 2013-08-19
发 贴: 14
|
|
|
你的这个问题和CPU的中断控制器相关,提升级别的同时也在屏蔽部分中断。在64位win7里面对级别的提升操作的是CR8这个寄存器,在文档中可以看到对它的设置,会影响PPR寄存器。如果提升到APC级别那么就屏蔽了特权>=1以下的中断,2号中断正好是你所说的线程任务切换用的。如果不恢复回去那么便不会在这个处理器上进行任务切换了。这也许便是文档中强调一定要再切回原来的级别。32位CPU中没有CR8,但我没有找到它操作PCR->IRQL的代码。但想必是一样的。张老师,不知道我说的对不对。呵呵。
|
|
|
IP 地址: 已记录
|
报告
|
|
|
|
2013-08-28, 08:38 上午
|
格蠹老雷
注册: 2005-12-19
发 贴: 1,303
|
|
|
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执行的。
这样的问题值得深究,但是三言两语很难说清,这几天会找个时间写篇博客,用调试的方法,再举些例子...
|
|
|
IP 地址: 已记录
|
报告
|
|
|
|
2013-08-28, 10:08 上午
|
kkindof
注册: 2011-11-10
发 贴: 15
|
Re: 一起来探讨个有意思的问题
|
|
|
|
|
|
IP 地址: 已记录
|
报告
|
|
|
|
2013-08-28, 13:52 下午
|
WillingBug163
注册: 2013-08-19
发 贴: 14
|
|
|
|
|
IP 地址: 已记录
|
报告
|
|
|
|
2013-09-01, 22:14 下午
|
格蠹老雷
注册: 2005-12-19
发 贴: 1,303
|
|
|
|
|
IP 地址: 已记录
|
报告
|
|
|
|
高端调试 » 软件调试 » Windows内核调试 » 一起来探讨个有意思的问题
|
|
|
|
|
|