首页
论坛
课程
招聘
Windows内核学习笔记一----浅谈对APC机制的一点理解
2021-2-22 03:00 3250

Windows内核学习笔记一----浅谈对APC机制的一点理解

2021-2-22 03:00
3250

好几年没发原创帖了,说来惭愧,今天转存一下笔记,浅谈一下自己对windows的apc机制的一点理解。

在windows里如果线程A的apc要交付,可能在线程A的上下文直接调用KiDeliverApc交付;也可能对线程A所在processor发一个APC_LEVEL的ipi(可能是self ipi,也可能是其它processor对当前processor发出的ipi,这里以发self ipi的情形加以说明)。第二种情况纯属一厢情愿,因为当这个ipi对应的isr执行时,此时的processor上的线程可能就不是线程A,而有可能是线程B(因为发这个APC_LEVEL ipi前的irql(从wrk代码中看到此时的irql为SYNC_LEVEL)可能低于时钟中断对应的IRQL,这就很可能会因为线程A的时限用完导致在发出APC_LEVEL的ipi之后到这个ipi的isr执行时之间当前processor会有一个pending状态的DISPATCH_LEVEL的中断,当前processor的IRQL降低到DISPATCH_LEVEL以下时这个DISPATCH_LEVEL中断执行,导致调度器选择线程B在当前processor上执行,然后APC_LEVEL中断到来时处于线程B的上下文),在这里好像会造成“本来是让线程A的apc交付,结果当前processor的APC_LEVEL中断却让线程B的apc交付(如果线程B有apc待交付且满足交付条件),而这个APC_LEVEL的中断造成线程A的apc得不到交付,但是线程A的KernelApcPending一直为TRUE”。想了很久,最终决定搜索wrk代码,忽然发现SwapContext里会检测新线程的KernelApcPending,返回后相关函数判断KernelApcPending为TRUE时直接在新线程上下文调用KiDeliverApc交付新线程的apc。至此迷题解开,即当线程A在将来某个时机被调度执行,它的apc肯定有机会被交付,虽然错失了此前本想在APC_LEVEL中断执行时交付的机会。终于明白为什么线程切换回时会交付apc,这也确实能说明apc只跟特定线程相关。


看雪2022 KCTF 秋季赛 防守篇规则,征题截止日期11月12日!(iPhone 14等你拿!)

最后于 2021-2-22 03:02 被fengyunabc编辑 ,原因:
收藏
点赞0
打赏
分享
最新回复 (2)
雪    币: 919
活跃值: 活跃值 (1308)
能力值: ( LV2,RANK:15 )
在线值:
发帖
回帖
粉丝
丿一叶知秋 活跃值 2021-2-22 11:04
2
0
好久没见大佬冒泡了!
雪    币: 919
活跃值: 活跃值 (1308)
能力值: ( LV2,RANK:15 )
在线值:
发帖
回帖
粉丝
丿一叶知秋 活跃值 2021-2-22 11:14
3
0
大佬这个笔记坚定了 APC的特性就是特定线程执行,虽然被DPC切换到了任意线程上下文后但是DPC进行线程调度最终会有一个回到线程A上下文的时机,因此,线程A的APC得以交付(不管是哪个processor)。
游客
登录 | 注册 方可回帖
返回