Windows进程与线程学习笔记(六)—— 线程切换

前言

一、学习自滴水编程达人中级班课程,官网:https://bcdaren.com
二、海东老师牛逼!

主动切换

  1. 在上一篇中,分析了模拟线程切换:SwitchThread
  2. 在Windows中,也有类似的函数:KiSwapContext

分析KiSwapContext

KiSwapContext
查看405837处ECX的来源:KiSwapThread
ECX

分析SwapContext

SwapContext
SwapContext

分析KiSWapThread

查看交叉引用表,也就是有哪些函数调用了这个函数
KiSWapThread
再查看其中 KeWaitForSingleObject 的交叉引用
KeWaitForSingleObject

总结

  1. Windows中绝大部分API都调用了SwapContext这个函数,也就是说,只要调用了该函数,就会导致线程切换
  2. 线程切换时会比较是否属于同一个进程,如果不是,便切换Cr3,Cr3换了,进程也就切换了

思考

  1. 如果不调用API,就可以一直占用CPU吗?
  2. 如果当前线程不去调用系统API,操作系统如何实现线程切换

时钟中断切换

中断一个正在执行的程序的方式:

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

系统时钟

系统时钟

  1. 在Windows操作系统当中,没个10~20毫秒便会触发一次时钟中断
  2. 如要获取当前的时钟间隔值,可使用Win32 API:GetSystemTimeAdjustment

执行流程
执行流程

分析INT 0x30

ALT+T定位IDT表
IDT
IDT
KiStartUnexpectedRange
KiStartUnexpectedRange
KiStartUnexpectedRange 跳到了另一个函数:KiUnexpectedInterruptTail
KiUnexpectedInterruptTail
KiUnexpectedInterruptTail 调用了 HalBeginSystemInterruptHalEndSystemInterrupt
HalBeginSystemInterrupt
在导入表中查看这两个函数来源,都来自HAL.dll
HalBeginSystemInterrupt
HalEndSystemInterrupt

分析HAL.dll

HalBeginSystemInterrupt
在这里插入图片描述
HalEndSystemInterrupt
HalEndSystemInterrupt
KiDispatchInterrupt 又来自 ntoskrnl
KiDispatchInterrupt
最终,KiDispatchInterrupt 调用了 SwapContext
KiDispatchInterrupt

异常处理

  1. 如果一个线程不调用API,并且在代码中屏蔽中断(调用CLI指令),并且不会出现异常,那么当前线程将永久占有CPU
  2. 单核CPU占用率100%,2核CPU占用率50%
  3. Windows并非是“抢占式”操作系统,所谓的“抢“”必须是当前线程允许其它线程“抢”,否则是“抢”不到的
发布了45 篇原创文章 · 获赞 2 · 访问量 1831

猜你喜欢

转载自blog.csdn.net/qq_41988448/article/details/103406636