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

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

要点回顾

  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环堆栈

实验:分析SwapContext

线程切换与TSS相关部分

地址 4059D0 处,EAX 的来源

线程切换对TSS的其它操作

线程切换与FS

描述

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

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

段描述符结构

分析SwapContext

总结

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

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

  1. Windows进程与线程学习笔记(九)—— 线程优先级/进程挂靠/跨进程读写

    Windows进程与线程学习笔记(九)-- 线程优先级/进程挂靠/跨进程读写 要点回顾 线程优先级 调度链表 分析 KiFindReadyThread 分析 KiSwapThread 总结 进程挂靠 ...

  2. Windows进程与线程学习笔记(七)—— 时间片管理

    Windows进程与线程学习笔记(七)-- 时间片管理 要点回顾 基本概念 CPU时间片 分析 KeUpdateRunTime 分析 KiDispatchInterrupt 备用线程 总结 要点回顾 ...

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

    Windows进程与线程学习笔记(六)-- 线程切换 主动切换 分析KiSwapContext 分析SwapContext 分析KiSWapThread 总结 时钟中断切换 系统时钟 分析INT 0x ...

  4. Windows进程与线程学习笔记(五)—— 模拟线程切换

    Windows进程与线程学习笔记(五)-- 模拟线程切换 ThreadSwitch代码分析 ThreadSwitch.cpp ThreadCore.h ThreadCore.cpp 总结 Thread ...

  5. Windows进程与线程学习笔记(四)—— 等待链表调度链表

    Windows进程与线程学习笔记(四)-- 等待链表&调度链表 要点回顾 33个链表 等待链表 实验:分析等待链表中的线程所属的进程 第一步:查看所属线程结构体: 第二步:查看所属进程结构体 ...

  6. Windows进程与线程学习笔记(三)—— KPCR

    Windows进程与线程学习笔记(三)-- KPCR KPCR +0x000 NtTib : _NT_TIB +0x120 PrcbData : _KPRCB KPCR 描述:CPU控制区(Proce ...

  7. Windows进程与线程学习笔记(二)—— 线程结构体

    Windows进程与线程学习笔记(二)-- 线程结构体 线程结构体 ETHREAD +0x000 Tcb : _KTHREAD 练习 线程结构体 ETHREAD 描述: 每个windows线程在0环都 ...

  8. Windows进程与线程学习笔记(一)—— 进程结构体

    Windows进程与线程学习笔记(一)-- 进程结构体 进程结构体 EPROCESS +0x000 Pcb : _KPROCESS +0x1b0 Peb : Ptr32 _PEB 练习 解题步骤 第一 ...

  9. Linux进程线程学习笔记:运行新程序

    Linux进程线程学习笔记:运行新程序 周银辉 在上一篇中我们说到,当启动一个新进程以后,新进程会复制父进程的大部份上下文并接着运行父进程中的代码,如果我们使新进程不运行原父进程的代码,转而运行另外一 ...

最新文章

  1. 手把手教你使用Flask轻松部署机器学习模型(附代码链接) | CSDN博文精选
  2. 我对浮动的认识(一)
  3. 虚拟路由器冗余协议(VRRP)原理与实验
  4. 数据库中的实体、元组、字段、属性、码、分量、依赖关系、完全部份传递依赖、范式等你了解吗?【笔记自用】
  5. linux shell之case用法
  6. 【Kafka】Kafka InvalidReceiveException: Invalid receive (size = 369296128 larger than 104857600)
  7. 道路里程桩号标注_划重点!我区国、省道交通标志及里程桩“变脸”了,今后开车更享受~...
  8. 后悔当初没考研。。。
  9. (一)区块链的共识算法:整体介绍 及 分叉 的通俗讲解
  10. java 用word模板打标签,并插入图片 动态生成word
  11. Web在线聊天室(6) --- login登录接口
  12. Navicat因导入的sql文件中时间数据类型有参数而报错的原因(例:datetime(3))
  13. ThinkPHP5.0 中使用荣联云通讯
  14. day54-网络安全
  15. RxJava2.x是一个非常棒的流式编程,采用的观察者模式思想,事件的产生者产生事间之后发送给绑定的接受者,接受顺序与发送顺序一致.但是 是独立于RxJava1.x存在,本文讲解RxJava2.x的简
  16. 360网站卫士SQL注入绕过案例一个
  17. Stay Hungry, Stay Foolish — 求知若饥,虚心若愚!
  18. 用python中re.sub()替换文件中指定字符串
  19. 操作系统,本质为软件,直接与硬件交互,操作系统管理与服务应用进程,应用难以脱离操作系统单独运行,避免单进程独占资源,卡死操作系统与避免被卡死
  20. openssl之EVP系列之5---EVP_Encrypt系列函数具体解释(二)

热门文章

  1. Paper:《Adam: A Method for Stochastic Optimization》的翻译与解读
  2. 成功解决 将xgboost的plot_importance绘图时出现的f0、f1、f2、f3、f4、f5等改为对应特征的字段名
  3. Dataset之Cityscapes:Cityscapes数据集的简介、安装、使用方法之详细攻略
  4. ML之UliR:利用非线性回归,梯度下降法(迭代十万次)求出学习参数θ,进而求得Cost函数最优值
  5. errno_t open_s()打开文件出现的错误分析
  6. 如何用ps简单快速扣头发丝
  7. Divide and conquer:K Best(POJ 3111)
  8. 应用程序文件Android安全分析挑战:运行时篡改Dalvik字节码
  9. [BTS] Could not find stored procedure 'mp_sap_check_tid'
  10. 小功能 获取一段汉字的拼音首字母