FS:[0]寄存器在3环时指向TEB.进入0环后FS:[0]指向KPCR

系统中同时存在很多个线程,这就意味着FS:[0]在3环时指向的TEB要有多个(每个线程一份)。

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

下面是ida的分析SwapContext代码

                        ; CODE XREF: SwapContext+85j; SwapContext+AEj
mov eax,[ebx+KPCR.NtTib.Self] ; 取出目标线程的TEB
mov ecx,[ebx+KPCR.GDT]  ; 获取GDT
mov     [ecx+3Ah], ax   ; 修改GDT表中的段描述符基址 AX存储地址的低2字节 存储到段描述符低4字节的第16:31位
shr     eax, 10h        ; 右移16位得到地址的高2字节
mov     [ecx+3Ch], al   ; 修改高4字节的0:7位
mov     [ecx+3Fh], ah   ; 修改高4字节的31:24位
inc [esi+ETHREAD.Tcb.ContextSwirches] ; 目标线程的ContextSwitches+1这个值应该是用了统计切换次数
inc [ebx+KPCR.PrcbData.KeContextSwitches] ; 当前CPU的K额ContextSwitches统计信息
pop     ecx
mov     [ebx], ecx
cmp [esi+ETHREAD.Tcb.ApcState.KernlApcPending],0
jnz     short loc_404A00
popf
xor     eax, eax
retn

10.Windows线程切换_FS段寄存器相关推荐

  1. Windows核心编程_FS段寄存器

    Windows核心编程_FS段寄存器 FS段寄存器Windows用来存储一些进程信息的,FS段的首地址是存储这些进程信息的首地址:在内核态FS指向GDT表的:0x30地址, 在用户态FS=0x3B 也 ...

  2. 9.Windows线程切换_TSS

    SwapContext这个函数是Windows线程切换的核心,无论是主动切换还,是系统时钟导致的线程切换,最终都会调用这个函数. 在这个函数中除了切换堆栈以外,还做了很多其他的事情,了解这些细节对我们 ...

  3. 进程线程004 Windows线程切换的三种方式

    文章目录 主动切换(调用API) KiSwapContext函数分析 哪些API调用了SwapContext函数 总结 时钟中断切换 如何中断一个正在执行的程序 系统时钟 时钟中断的执行流程 总结 时 ...

  4. Windows线程同步--关键段和旋转锁

    关键段 关键段(Critical Section)是一小段代码,它在执行之前需要独占对一些共享资源的访问权.这种方式可以让多行代码以"原子方式"对资源进行操控.这里的原子方式,指的 ...

  5. 6.windows线程切换_主动切换

    ida 分析KiSwapThread sub esp, 10h mov [esp+10h+var_4], ebx ;保存当前线程寄存器现场 mov [esp+10h+var_8], esi mov [ ...

  6. 进程线程006 Windows线程切换-线程优先级

    文章目录 内容回顾 调度链表 如何高效查找 如果没有就绪线程怎么办 内容回顾 之前我们已经了解过,有三种情况会导致线程切换: 当前线程主动调用API:API函数–>KiSwapThread–&g ...

  7. 7.Windows线程切换_时钟中断切换

    绝大部分系统内核函数都会调用SwapContext函数,来实现线程的切换,那么这种切换是线程主动调用的. 如何中断一个正在执行的程序? 异常 比如缺页,或者INT N指令 中断 比如时钟中断 系统时钟 ...

  8. 8.Windows线程切换_时间片管理

    时钟中断会导致线程进行切换,但并不是说只要有时钟中断就一定会切换线程,时钟中断时,两种情况会导致线程切换: 当前的线程CPU时间片到期 有备用线程(KPCR.PrcbData.NextThread) ...

  9. 11.Windows线程切换_线程优先级

    (1).当前线程主动调用API: API函数->KiSwapThread->KiSwapContext->SwapContexti (2).当前线程时间片到期: KiDispatch ...

最新文章

  1. POI各Jar包的作用
  2. python—多线程之守护线程
  3. Python 操作 MySQL 的5种方式
  4. 第四代Express框架koa简介
  5. 2019.01.24【NOIP普及组】模拟赛C组
  6. Java List<T>去重方法,引用类型集合去重
  7. ASCII、ANSI、UNICODE及UTF-8编码
  8. linux代码windows能跑吗,能不能帮忙改一下下面这些代码,原来是在windows系统上运行的,要让它能在linux上终端跑。该如何处理...
  9. 【工具使用系列】关于 MATLAB 神经网络故障诊断,你需要知道的事
  10. 金橙子dll使用说明
  11. 好用的项目工时管理系统有哪些
  12. 关于ARPG发展之操作和技能之泛泛而谈(转)
  13. qcom vfe笔记(msm8996平台)
  14. “包”治百病,BOS丰富的预付费资源包来了
  15. Tushare不止数字!新文字特色数据 ---(4)
  16. 马尾综合征是腰椎间盘突出患者的严重并发症
  17. java overload_Java方法重载Overload原理及使用解析
  18. 读书笔记:《学会提问》
  19. 侍魂胧月传说服务器维护中,侍魂胧月传说手游4月8日停机维护更新公告
  20. 如何承接软件外包项目

热门文章

  1. AI英特尔杯公开课:2019.06.27在线直播《研究生人工智能创新大赛—AI赋能,创新引领》课堂笔记和感悟(一)
  2. Windows:利用各种小工具查看自己电脑上的CPUGPU型号、个数、详细参数等不同方法的详细攻略
  3. 如何使用hyperopt对xgboost进行自动调参
  4. FORTRAN学习记录(持续更新)
  5. jQuery-easyui和validate表单验证实例
  6. pageHelper插件
  7. 嵌入式培训学习历程第二十二天
  8. Strut2判断是否是AJAX调用
  9. 读写xml节点的数据总结
  10. ESP32 OTA 策略的优点与可能的问题