绝大部分系统内核函数都会调用SwapContext函数,来实现线程的切换,那么这种切换是线程主动调用的。

如何中断一个正在执行的程序?

  1. 异常 比如缺页,或者INT N指令
  2. 中断 比如时钟中断


系统时钟
7.Windows线程切换_时钟中断切换

  • Windows系列操作系统: 10-20毫秒
  • 如要获取当前的时钟间隔值,可使用Win32API:
    GetSystemTimeAdjustment


ida中ALT+T搜索_IDT 点进去
7.Windows线程切换_时钟中断切换
这个api就是0x30,追进去
7.Windows线程切换_时钟中断切换
这两个api不是当前模块的是HAL.dll中的,下面来打开它

7.Windows线程切换_时钟中断切换
跟到里面又发现一个不是hal.dll中的api,它属于ntoskrnl.exe中的调来调去最终都要会到ntoskrnl。

7.Windows线程切换_时钟中断切换
KiDispatchInterrupt中调用了SwapContext,所以当触发了时钟中断也会使线程切换。

时钟中断执行流程
7.Windows线程切换_时钟中断切换

线程切换的几种情况:

  1. 主动调用API函数
  2. 时钟中断.
  3. 异常处理

如果一个线程不调用API,在代码中屏蔽中断(CLI指令),并且不会出现异常,那么当前线程将永久占有CPU,单核占有率 100% 2核就是50%

相关文章: