在调用门、中断门与陷阱门中,一旦出现权限切换,那么就会有堆栈的 ,切换。而且,由于CS的CPL发生改变,也导致了SS也必须要切换。

切换时,会有新的ESP和SS(CS是由中断门或者调用门指定)这2个值从哪里来的呢?

答案: TSS (Task-state segment ),任务状态段

TSS就是一块内存,大小104个节。

不要把TSS与任务切换联系到一起
TSS的意义就在于可以同时换掉一堆寄存器


TSS是段描述符,从GDT表中的加载出来的
系统启动-》从GDT表中的加载出的TSS-》放到TR寄存器里,系统要用直接找TR寄存器


TSS是系统段,s位为0,TYPE域为:1001或者1011
这两特征说明他是一个TSS段描述符,type为1001说明这个tss没有加载到TR寄存器中,1011说明已经加载到TR寄存器中
tss的颗粒位为0(G位)

TR寄存器读写:
1)将TSS段描述符加载到TR寄存器
指令: LTR
说明:
用LTR指令去装载的话仅仅是改变TR寄存器的值(96位)并没有真正改变TSS
LTR指令只能在系统层使用
加载后TSS段描述符会状态位会发生改变(1001变1011)

2)读TR寄存器
指令: STR
说明:如果用STR去读的话,只读了TR的16位也就是选择子(可见部分)

修改TR寄存器
1)在Ringo我们可以通过LTR临令去修改TR寄存器
2)在Ring3我们可以通过CALL FAR或者JMP FAR指令来修改

用JMP去访问一个代码段的时候,改变的是CS和EIP:
JMP 0x48:0x123456如果0x48是代码段
执行后: CS->0x48 ElP.-x123456

用JMP去访问一个任务段的时候:
如果0x48是TSS段描述符,先修改TR寄存器,在用TR.Base指向的TSS中的值修改当前的器存器

TSS存在的意义
提权时栈切换用到了 TSS
切换一堆寄存器

测试

修改gdt。
xx00e9xx`xxxx0068
xx为base,填TSS的

#include<windows.h>
#include<stdio.h>typedef struct TSS {DWORD link; // 保存前一个 TSS 段选择子,使用 call 指令切换寄存器的时候由CPU填写。// 这 6 个值是固定不变的,用于提权,CPU 切换栈的时候用DWORD esp0; // 保存 0 环栈指针DWORD ss0;  // 保存 0 环栈段选择子DWORD esp1; // 保存 1 环栈指针DWORD ss1;  // 保存 1 环栈段选择子DWORD esp2; // 保存 2 环栈指针DWORD ss2;  // 保存 2 环栈段选择子// 下面这些都是用来做切换寄存器值用的,切换寄存器的时候由CPU自动填写。DWORD cr3;DWORD eip;DWORD eflags;DWORD eax;DWORD ecx;DWORD edx;DWORD ebx;DWORD esp;DWORD ebp;DWORD esi;DWORD edi;DWORD es;DWORD cs;DWORD ss;DWORD ds;DWORD fs;DWORD gs;DWORD ldt;// 这个暂时忽略DWORD io_map;
} TSS;char st[10] = { 0 }; // 0042b034
DWORD g_esp = 0;
DWORD g_cs = 0;TSS tss = {        // 0x00427b400x00000000,//link(DWORD)st, //esp00x00000010,//ss00x00000000,//esp10x00000000,//ss10x00000000,//esp20x00000000,//ss20x00000000,//cr30x0045a0c0,//eip-----填裸函数地址0x00000000,//eflags0x00000000,//eax0x00000000,//ecx0x00000000,//edx0x00000000,//ebx(DWORD)st, //esp0x00000000,//ebp0x00000000,//esi0x00000000,//edi0x00000023,//es  0x00000008,//cs  0x00000010,//ss0x00000023,//ds0x00000030,//fs0x00000000,//gs0x00000000,//ldt0x20ac0000
};void __declspec(naked) func() {//0045a0c0__asm {int 3mov g_esp, espmov eax, 0mov ax, csmov g_cs, eaxiret//中断返回指令}
}
int main(int argc, char* argv[])
{printf("%x\n", &tss);printf("cr3:\n");scanf("%x", &(tss.cr3));char buffer[6] = { 0, 0, 0, 0, 0x48, 0 };__asm {call fword ptr[buffer]}printf("g_cs = %08x\ng_esp = %08x\n", g_cs, g_esp);getchar();return 0;
}

9.任务段(TSS)相关推荐

  1. 任务状态段TSS及TSS描述符、局部描述符表LDT及LDT描述符

    1.TSS介绍 在一个多任务环境中,当发生了任务切换,需保护现场,因此每个任务的应当用一个额外的内存区域保存相关信息,即任务状态段(TSS):TSS格式固定,104个字节,处理器固件能识别TSS中元素 ...

  2. 一步步编写操作系统 61 任务状态段 TSS

    I/O位图是位于TSS中的,它可以存在也可以不存在,它只是用来设置对某些特定端口的访问,没有它的话便默认为禁止访问所有端口.正是由于它可有可用,所以TSS的段界限TSS limit(即实际大小-1)并 ...

  3. 一步步编写操作系统 53 任务状态段TSS介绍

    操作系统是利用PCB来维护所有任务的,包括进程和线程,但cpu提供的是TSS,linux系统可没用它,因为效率太低.但是还是要了解下TSS才清楚操作系统中某些操作的原因. 本节中所讲的特权级与它有着密 ...

  4. 全局描述表GDT、任务状态段TSS、局部描述表LDT之间的关系

    最近在学习哈工大操作系统时碰到了TSS的相关知识,感觉还牵涉到了GDT.LDT的相关知识,这里大概把相关的知识总结一下,以供以后参考 全局描述符表GDT 在计算机从实模式(16位)转换到保护模式(32 ...

  5. 任务状态段TSS和TSS描述符

    摘自<Intel® 64 and IA-32 Architectures Software Developer's Manual Combined Volumes1, 2A, 2B, 2C, 2 ...

  6. Linux0.11进程切换和TSS结构

    TSS 全称为task state segment,是指在操作系统进程管理的过程中,进程切换时的任务现场信息.       X86体系从硬件上支持任务间的切换.为此目的,它增设了一个新段:任务状态段( ...

  7. Windows保护模式学习笔记(五)—— 任务段任务门

    Windows保护模式学习笔记(五)-- 任务段&任务门 要点回顾 任务段 TSS (Task-state segment ) TR段寄存器 TR段寄存器的读写 TSS段描述符 实验:加载自定 ...

  8. linux mmu的实现的讲解_Linux中的段

    Intel 微处理器的段机制是从8086 开始提出的, 那时引入的段机制解决了从CPU 内部 16 位地址到20 位实地址的转换.为了保持这种兼容性,386 仍然使用段机制,但比以前复杂. 因此,Li ...

  9. x86保护模式 任务状态段和控制门

    x86保护模式    任务状态段和控制门 每个任务都有一个任务状态段TSS     用于保存任务的有关信息     在任务内权变和任务切换时  需要用到这些信息    任务内权变的转移和任务切换  一 ...

最新文章

  1. RxSwift之深入解析URLSession的数据请求和数据处理
  2. 【案例】护士发错药怎么处理?
  3. 阿里云存储OSS中设置上传文件content type
  4. Python爬虫入门七正则表达式
  5. SQL Server常用的系统存储过程应用实例(转)
  6. 用Flink取代Spark Streaming!知乎实时数仓架构演进
  7. 淘宝「改名自由」后,上百万人连夜告别了前任……
  8. 消息框messagebox的使用
  9. JAVA无法加载此类文件,ORA-00376: 此时无法读取文件问题处理
  10. HTML5媒体(音频/视频)
  11. 2019 年对 VR 设备的五个期待
  12. Recoverit for Mac专业的数据恢复工具
  13. 高通工具过滤_高通QXDM|高通诊断监视工具(Qualcomm QXDM)下载v3.14 官方版 - 欧普软件下载...
  14. 数学建模——相关系数、皮尔逊相关系数、斯皮尔曼相关系数
  15. InTouch 如何备份驱动的通信配置
  16. 计算机如何把表格分成两排,wps表格怎么拆分单元格,excel单元格拆分两列
  17. 最全华为ensp路由器启动失败错误代码40怎么办?
  18. 眼部化妆品、护肤品亚马逊要求的BCOP眼刺激性测试是什么
  19. 交通大学计算机科学考研_选择计算机科学作为大学专业之前需要知道的事情
  20. 如何使用计算机处理文件,怎么处理电脑的缓存文件

热门文章

  1. CV之Hog+HamMingDistance:基于Hog提取和汉明距离对比的应用—图像相似度对比之for循环将多个成对图片依次对比并输出相似度
  2. Py之PyWapFetion:PyWapFetion的简介、安装、使用方法之详细攻略
  3. Python2/3 list set性能测试
  4. 在Linux上如何安装Oracle数据库
  5. Jmeter Web 性能测试入门 (六):Jmeter 解析 response 并传递 value
  6. Win8怎么查看IP地址
  7. php的yii框架开发总结2
  8. AB1601的波特率注意事项
  9. 功率电感器基础讲座-第1章-2_转载自村田官网
  10. 从键盘输入一串连续的数字,判断输出是否为电话号码