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

要点回顾

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

线程切换与TSS

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

内核堆栈

内核堆栈
内核堆栈结构

调用API进0环

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

实验:分析SwapContext

线程切换与TSS相关部分
SwapContext
地址 4059D0 处,EAX 的来源
EAX来源
线程切换对TSS的其它操作
在这里插入图片描述

线程切换与FS

描述

  1. FS:[0]寄存器在3环时指向TEB,进入0环后FS:[0]指向KPCR
  2. 系统中同时存在很多个线程,这就意味着FS:[0]在3环时指向的TEB要有多个(每个线程一份)

思考:在实际的使用中我们发现,当我们在3环查看不同线程的FS寄存器时,FS的段选择子都是相同的,那么如何实现通过一个FS寄存器指向多个TEB

段描述符结构

段描述符结构

分析SwapContext

SwapContext

总结

  1. Windows进行线程切换时,只用到了TSS中的ESP0Cr3,其它都没用到
  2. Windows进行线程切换时,通过修改KPCRBase达到切换FS段寄存器的目的
  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值