绝大部分系统内核函数都会调用SwapContext函数,来实现线程的切换,那么这种切换是线程主动调用的。
如何中断一个正在执行的程序?
- 异常 比如缺页,或者INT N指令
- 中断 比如时钟中断
系统时钟
- Windows系列操作系统: 10-20毫秒
- 如要获取当前的时钟间隔值,可使用Win32API:
GetSystemTimeAdjustment
ida中ALT+T搜索_IDT 点进去
这个api就是0x30,追进去
这两个api不是当前模块的是HAL.dll中的,下面来打开它
跟到里面又发现一个不是hal.dll中的api,它属于ntoskrnl.exe中的调来调去最终都要会到ntoskrnl。
KiDispatchInterrupt中调用了SwapContext,所以当触发了时钟中断也会使线程切换。
时钟中断执行流程
线程切换的几种情况:
- 主动调用API函数
- 时钟中断.
- 异常处理
如果一个线程不调用API,在代码中屏蔽中断(CLI指令),并且不会出现异常,那么当前线程将永久占有CPU,单核占有率 100% 2核就是50%