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中的ESP0与Cr3,其它都没用到
- Windows进行线程切换时,通过修改KPCR的Base达到切换FS段寄存器的目的
Windows进程与线程学习笔记(八)—— 线程切换与TSS/FS相关推荐
- Windows进程与线程学习笔记(九)—— 线程优先级/进程挂靠/跨进程读写
Windows进程与线程学习笔记(九)-- 线程优先级/进程挂靠/跨进程读写 要点回顾 线程优先级 调度链表 分析 KiFindReadyThread 分析 KiSwapThread 总结 进程挂靠 ...
- Windows进程与线程学习笔记(七)—— 时间片管理
Windows进程与线程学习笔记(七)-- 时间片管理 要点回顾 基本概念 CPU时间片 分析 KeUpdateRunTime 分析 KiDispatchInterrupt 备用线程 总结 要点回顾 ...
- Windows进程与线程学习笔记(六)—— 线程切换
Windows进程与线程学习笔记(六)-- 线程切换 主动切换 分析KiSwapContext 分析SwapContext 分析KiSWapThread 总结 时钟中断切换 系统时钟 分析INT 0x ...
- Windows进程与线程学习笔记(五)—— 模拟线程切换
Windows进程与线程学习笔记(五)-- 模拟线程切换 ThreadSwitch代码分析 ThreadSwitch.cpp ThreadCore.h ThreadCore.cpp 总结 Thread ...
- Windows进程与线程学习笔记(四)—— 等待链表调度链表
Windows进程与线程学习笔记(四)-- 等待链表&调度链表 要点回顾 33个链表 等待链表 实验:分析等待链表中的线程所属的进程 第一步:查看所属线程结构体: 第二步:查看所属进程结构体 ...
- Windows进程与线程学习笔记(三)—— KPCR
Windows进程与线程学习笔记(三)-- KPCR KPCR +0x000 NtTib : _NT_TIB +0x120 PrcbData : _KPRCB KPCR 描述:CPU控制区(Proce ...
- Windows进程与线程学习笔记(二)—— 线程结构体
Windows进程与线程学习笔记(二)-- 线程结构体 线程结构体 ETHREAD +0x000 Tcb : _KTHREAD 练习 线程结构体 ETHREAD 描述: 每个windows线程在0环都 ...
- Windows进程与线程学习笔记(一)—— 进程结构体
Windows进程与线程学习笔记(一)-- 进程结构体 进程结构体 EPROCESS +0x000 Pcb : _KPROCESS +0x1b0 Peb : Ptr32 _PEB 练习 解题步骤 第一 ...
- Linux进程线程学习笔记:运行新程序
Linux进程线程学习笔记:运行新程序 周银辉 在上一篇中我们说到,当启动一个新进程以后,新进程会复制父进程的大部份上下文并接着运行父进程中的代码,如果我们使新进程不运行原父进程的代码,转而运行另外一 ...
最新文章
- 手把手教你使用Flask轻松部署机器学习模型(附代码链接) | CSDN博文精选
- 我对浮动的认识(一)
- 虚拟路由器冗余协议(VRRP)原理与实验
- 数据库中的实体、元组、字段、属性、码、分量、依赖关系、完全部份传递依赖、范式等你了解吗?【笔记自用】
- linux shell之case用法
- 【Kafka】Kafka InvalidReceiveException: Invalid receive (size = 369296128 larger than 104857600)
- 道路里程桩号标注_划重点!我区国、省道交通标志及里程桩“变脸”了,今后开车更享受~...
- 后悔当初没考研。。。
- (一)区块链的共识算法:整体介绍 及 分叉 的通俗讲解
- java 用word模板打标签,并插入图片 动态生成word
- Web在线聊天室(6) --- login登录接口
- Navicat因导入的sql文件中时间数据类型有参数而报错的原因(例:datetime(3))
- ThinkPHP5.0 中使用荣联云通讯
- day54-网络安全
- RxJava2.x是一个非常棒的流式编程,采用的观察者模式思想,事件的产生者产生事间之后发送给绑定的接受者,接受顺序与发送顺序一致.但是 是独立于RxJava1.x存在,本文讲解RxJava2.x的简
- 360网站卫士SQL注入绕过案例一个
- Stay Hungry, Stay Foolish — 求知若饥,虚心若愚!
- 用python中re.sub()替换文件中指定字符串
- 操作系统,本质为软件,直接与硬件交互,操作系统管理与服务应用进程,应用难以脱离操作系统单独运行,避免单进程独占资源,卡死操作系统与避免被卡死
- openssl之EVP系列之5---EVP_Encrypt系列函数具体解释(二)
热门文章
- Paper:《Adam: A Method for Stochastic Optimization》的翻译与解读
- 成功解决 将xgboost的plot_importance绘图时出现的f0、f1、f2、f3、f4、f5等改为对应特征的字段名
- Dataset之Cityscapes:Cityscapes数据集的简介、安装、使用方法之详细攻略
- ML之UliR:利用非线性回归,梯度下降法(迭代十万次)求出学习参数θ,进而求得Cost函数最优值
- errno_t open_s()打开文件出现的错误分析
- 如何用ps简单快速扣头发丝
- Divide and conquer:K Best(POJ 3111)
- 应用程序文件Android安全分析挑战:运行时篡改Dalvik字节码
- [BTS] Could not find stored procedure 'mp_sap_check_tid'
- 小功能 获取一段汉字的拼音首字母