欢迎访问 生活随笔!

生活随笔

当前位置: 首页 > 运维知识 > windows >内容正文

windows

Windows进程与线程学习笔记(八)—— 线程切换与TSS/FS

发布时间:2025/3/21 windows 37 豆豆
生活随笔 收集整理的这篇文章主要介绍了 Windows进程与线程学习笔记(八)—— 线程切换与TSS/FS 小编觉得挺不错的,现在分享给大家,帮大家做个参考.

Windows进程与线程学习笔记(八)—— 线程切换与TSS/FS

    • 要点回顾
    • 线程切换与TSS
      • 内核堆栈
      • 调用API进0环
      • 实验:分析SwapContext
    • 线程切换与FS
      • 段描述符结构
      • 分析SwapContext
    • 总结

要点回顾

  • SwapContext这个函数是Windows线程切换的核心,无论是主动切换还是系统时钟导致的线程切换,最终都会调用这个函数
  • 在这个函数中除了切换堆栈意外,还做了很多其他的事情,了解这些细节对我们学习操作系统至关重要
  • 本篇将学习线程切换与TSS、FS的关系
  • 线程切换与TSS

    描述:Intel设计TSS的目的是为了任务切换,但Windows与Linux并没有使用,而是采用堆栈来保存线程的各种寄存器
    思考:一个CPU只有一个TSS,但是线程很多,如何用一个TSS来保存所有线程的ESP0

    内核堆栈


    调用API进0环

    普通调用:通过TSS.ESP0得到0环堆栈
    快速调用:从MSR得到一个临时0环栈,代码执行后仍然通过TSS.ESP0得到当前线程0环堆栈

    实验:分析SwapContext

    线程切换与TSS相关部分

    地址 4059D0 处,EAX 的来源

    线程切换对TSS的其它操作

    线程切换与FS

    描述

  • FS:[0]寄存器在3环时指向TEB,进入0环后FS:[0]指向KPCR
  • 系统中同时存在很多个线程,这就意味着FS:[0]在3环时指向的TEB要有多个(每个线程一份)
  • 思考:在实际的使用中我们发现,当我们在3环查看不同线程的FS寄存器时,FS的段选择子都是相同的,那么如何实现通过一个FS寄存器指向多个TEB

    段描述符结构

    分析SwapContext

    总结

  • Windows进行线程切换时,只用到了TSS中的ESP0Cr3,其它都没用到
  • Windows进行线程切换时,通过修改KPCRBase达到切换FS段寄存器的目的
  • 总结

    以上是生活随笔为你收集整理的Windows进程与线程学习笔记(八)—— 线程切换与TSS/FS的全部内容,希望文章能够帮你解决所遇到的问题。

    如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。