线程被动切换【时钟中断】

本次实验使用的Win7 32位的10-10-12分页内核(单核)

分析过程

通过!IDT指令获取到其调用的时钟中断函数HalpHpetClockInterrupt
在这里插入图片描述通过lm获取hal模块路径
在这里插入图片描述取出放入IDA分析,发现其后会进入KeUpdateSystemTime
在这里插入图片描述继续跟入,发现其调用了HalRequestSoftwareInterrupt
在这里插入图片描述跟入后续调用KfLowerIrql在这里插入图片描述调用HalpCheckForSoftwareInterrupt
在这里插入图片描述调用HalpDispatchSoftwareInterrupt
在这里插入图片描述最终调用KiDispatchInterrupt
在这里插入图片描述通过分析其中最重要的地方是判断时间片是否到期和是否存在下一个线程
在这里插入图片描述时间片到期的话,则调用KiQuantumEnd
在这里插入图片描述通过阅读WRK代码,该KiQuantumEnd实现也是判断时间片,如果时间片到期了判断DisableQuantumPriority,并重新设置时间片和线程
在这里插入图片描述

存在下一个线程的话,将直接切换线程
在这里插入图片描述

总结

线程切换的三种情况

1.当前线程主动调用API:API函数–>KiSwapThread–>KiSwapContext–>SwapContext
2.当前线程的时间片到期:KiDispatchInterrrupt–>KiQuantumEnd–>KiSwapContext–>SwapContext
3.有备用线程:KiDispatchInterrrupt–>SwapContext
4.如果时钟中断的时候时间片没有到期且没有备用线程,那么函数会直接返回,不会发生线程切换

第一种是主动调用到内核API发送的,所以叫主动切换
第二种和第三种都是在时钟中断中发生的,所以叫被动切换

参考资料

https://blog.csdn.net/qq_38474570/article/details/104273704
https://www.cnblogs.com/onetrainee/p/12755998.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值