为什么引入TSS

【0】README

text description from orange’s implemention of a os and for complete code ,please visit https://github.com/pacosonTang/Orange-s-OS/blob/master/p62.asm.


【1】 回忆——关于堆栈

通过调用门进行有特权级变换的转移——理论篇

  • (1)出现的问题: call 指令 执行前后的堆栈已经不再是同一个堆栈 了,那么我们在堆栈A中压入参数和返回地址, 需要出栈(ret or retf)时,堆栈却变成了堆栈B, 这该怎么办呢?
  • (2)解决方法: Intel提供一种机制, 将堆栈A的内容复制到 堆栈B中, 如下图;
    这里写图片描述
    这里写图片描述

  • (3)TSS闪亮登场(task-state segment -任务状态段)
    (不同特权级的代码段间的转移,会发生堆栈切换,使得调用者的入栈的堆栈是针对调用者本身的堆栈, 而出栈操作是针对被调用者的堆栈,即入栈和出栈的堆栈不一致,使得特权级间跳转出错,故引入了 TSS)

  • 出现的问题: 由于每个任务可能在4个特权级间转移,故每个任务实际上需要4个堆栈;问题是:我们只有一个ss 和 esp, 那么当发生堆栈切换,我们该从哪里获取其他堆栈的ss 和 esp 呢?

  • 解决方法: 我们引入TSS, 它可以解决这个问题, TSS 数据结构 和 TSS段描述符的数据结构 如下;
    这里写图片描述
    这里写图片描述

【2】举个荔枝:

如,我们当前在ring3 , 当转移只ring1 时, 堆栈将被自动切换到由 ss1 和 esp1 指定的位置。由于只是在外层到内层(低特权级到高特权级)切换时,新堆栈才会从TSS中取得,所以TSS 并没有位于最外层 ring3 的堆栈信息;

(2.1)转移的过程中,CPU所做的工作:

  • 1) 根据目标代码段的DPL,从TSS中选择应该切换到哪个ss 和 esp;
  • 2) 从TSS 中读取新的ss 和 esp。在这个过程中,若发现ss、esp 或者 TSS 界限错误都会导致无效 TSS异常;
  • 3) 对ss 描述符进行检验,若发生错误,同样产生#TS异常;
  • 4) 暂时性保存当前ss 和 esp 的值;
  • 5) 加载新的 ss 和 esp;
  • 6) 将刚刚保存起来的ss 和 esp 的值压栈;
  • 7) 从调用者堆栈中将参数 复制到被调用者堆栈中(新堆栈中), 复制参数的数目由调用门中 Param Count一项来决定;
  • 8) 将当前的 cs 和 eip 压栈;
  • 9) 加载调用门中指定的新的cs 和 eip, 开始执行被调用者过程;

(2.2)从被调用者到调用者的返回过程中, 处理器的工作:
(实际上,ret这个指令不仅可以实现短返回和长返回, 而且可以实现带有特权级变换的长返回)

  • 1)检查保存的cs 中的RPL 以判断返回时是否要变换特权级;
  • 2)加载被调用者堆栈上的cs 和eip;
  • 3)如果ret 指令含有参数,则增加esp 跳过参数,然后esp 将指向被保存过的调用者ss 和 esp ;ret的参数个数对应 调用门中的 Param Count的值;
  • 4)加载ss 和 esp , 切换到调用者堆栈,被调用者的ss 和 esp 被丢弃;
  • 5)如果ret 指令含有参数, 增加esp 的值以跳过参数;
  • 6)检查ds、es、fs、gs的值,如果其中哪一个寄存器指向的段的DPL 小于CPL(此规则不适用于一致代码段),那么一个空描述符会被加载到该寄存器;

【3】总结:(使用调用门的过程实际上分为两部分)

  • (1)从低特权级到高特权级,通过调用门和call 指令来实现;
  • (2)从高特权级到低特权级, 通过ret 指令来实现;(即,ret 指令可以实现从高特权级到低特权级的转移)

(Attention):

  • A1)从调用者堆栈中将参数复制到被调用者堆栈(新堆栈)中, 复制参数的数目由 调用门中 Param Count 一项来决定,(调用门中 Param Count的作用);
  • A2) ret(retf)是call 的反过程, 只是带参数的ret 指令会同时释放事先被压栈的参数;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/332104.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

mysql 天数减1_mysql 日期操作 增减天数、时间转换、时间戳

MySQL datediff(date1,date2):两个日期相减 date1 - date2,返回天数。select datediff(2008-08-08, 2008-08-01); -- 7select datediff(2008-08-01, 2008-08-08); -- -7一、MySQL 获得当前日期时间 函数1.1 获得当前日期时间(date time)函数&#xff1a…

jdk open jdk_JDK 14的迹象开始出现

jdk open jdkJDK 13当前处于Rampdown阶段1 (RDP 1),计划在一周多一点的时间(2019年7月18日)进入Rampdown阶段2 (RDP 2),并暂定于2019年9月17日正式上市。当然,这意味着是…

Java集合ArrayList的学习

文章目录特点常用的方法集合迭代器特点 1.集合只能存放对象,可以存储重复元素,不允许存储 null 2.集合存放的对象类型可以不一致 3.集合的长度可以改变,初始大小10,最大容量 Integer.MAX_VALUE - 8,满时扩容&#xff…

知识复习(LDT+TSS+GATE+INTERRUPT)

【1】README 1.0)由于实现进程的切换任务,其功能涉及到 LDT TSS GATE INTERRUPT;下面我们对这些内容进行复习; 1.1) source code from orange’s implemention of a os . 【2】知识复习(LDTT…

arduinopn532模块_树莓派使用libnfc驱动ITEAD NFC PN532模块

libnfc是首个遵循GNU(自由工程项目)通用公共许可证针对所有人都完全免费的低级别NFC软件开发包和编程应用程序接口。它提供了完整的透明度且免费供大家使用。该库目前支持调制ISO / IEC14443 A和B,FeliCa,Jewel/Topaz标签及数据交换协议(P2P)作为目标和启…

jakarta ee_Jakarta EE的拟议命名空间

jakarta ee免责声明:这是我的个人观点,并不代表雇主的观点。 到目前为止,由于从Oracle迁移到Eclipse Foundation,每个人都知道我们需要将所有javax软件包名称重命名为其他名称。 (供参考,请参阅附录A&…

类ResourceBundle详解

类 ResourceBundle 的核心作用就是用来加载指定的属性资源文件(.properties 文件),其作用有点类似类 Properties。 public void test() {Locale locale new Locale("zh", "CN");// 根据指定的语言环境和基名加载资源文件…

Makefile浅尝

【0】README makefile定义: 一个工程中的源文件不计其数,其按类型、功能、模块分别放在若干个目录中,makefile定义了一系列的规则来指定,哪些文件需要一先编译,哪些文件需要后编译,哪些文件需要重新编译&a…

java类验证和装载顺序_Java类的加载顺序

1、有继承关系的加载顺序关于关键字static,大家 都知道它是静态的,相当于一个全局变量,也就是这个属性或者方法是可以通过类来访问,当class文件被加载进内存,开始初始化的时候,被static修饰的变量或者方法即…

java代码识别_识别Java中的代码气味

java代码识别作为软件开发人员,我们不仅要编写有效的代码,而且还要编写可维护的代码,这是我们的责任。 Martin Fowler在他的《重构:改进现有代码的设计》中将代码气味定义为: 通常对应于系统中更深层问题的表面指示 …

关于Java父子类继承的问题

1.子类无法继承父类的构造器 2.子类可以继承父类所有的变量和方法,父类私有的方法和变量也被继承到子类中,只是不可见而已,子类无法直接调用和访问。在子类对象中存储着父类中所有的变量的数据以及父类所有方法的引用地址。 3.被重写的父类方…

git连接到github(SSH无密码登陆)

【0】README 0.1)本文旨在尝试在linux环境下免密码连接到github,并进行push pull projects in github by git commands。0.1) 对ssh免密码登录有不熟悉的童鞋,please visit http://blog.csdn.net/pacosonswjtu/article/details/…

excel柱状图堆叠图显示总和_excel堆积柱形图显示百分比 在Excel堆积图中显示百分比标签的方法...

excel堆积柱形图显示百分比 在Excel堆积图中显示百分比标签的方法,前天刚学习了一个excel的新技术,叫“excel堆积柱形图显示百分比”授课老师对我们说,这一技术的专业全称为“excel堆积柱形图显示百分比 在Excel堆积图中显示百分比标签的方法…

java命令模式_Java中的命令设计模式

java命令模式在本教程中,我们将学习命令模式,这是一种重要的行为设计模式。 它具有一些重要的应用程序,例如在文本编辑器中实现撤消/重做功能。 在命令设计模式中,有一个命令对象位于发送方和接收方对象之间。 发送者对象可以创建…

抽象类与接口的区别

文章目录抽象类的理解接口的理解区别分析演示案例总结参考抽象类的理解 动物就是对某类事物的普遍性、共同性进行抽取后得到的用来反映这类事物本质的概念。 动物被定义为靠摄取有机物(植物、动物或微生物)来获得营养而不能完成无机物到有机物转化过程的能够对环境…

浅尝硬盘分区表

【0】README 0.1) text description from orange’s implemention of a os; 0.2) there are a number of analysis and attention proves to be essence of this page, I think; 0.3)Conclusion about hd partition table C1…

openjdk-7支持版本_长期支持对OpenJDK意味着什么?

openjdk-7支持版本Bruno Borges最近在推特上发布了一个有关OpenJDK的长期支持(LTS)的问题,这表明对它的真正含义仍有一些困惑。 在此博客文章中,我将解释不同部分如何组合在一起。 那么……谁说或在哪里说“ #OpenJDK 11”是LTS&…

android 安装卸载应用提醒_Android监听程序的安装和卸载

在android系统中,安装和卸载都会发送广播,当应用安装完成后系统会发android.intent.action.PACKAGE_ADDED广播。可以通过intent.getDataString()获得所安装的包名。当卸载程序时系统发android.intent.action.PACKAGE_REMOVED广播。同样intent.getDataStr…

常用函数式接口的学习

文章目录定义常用的函数式接口Supplier演示代码Consumeraccept 方法演示代码andThen 方法演示代码Predicatetest 方法and 方法演示代码or 方法negate 方法Functionapply 方法演示代码andThen 方法演示代码定义 有且仅有一个抽象方法的接口称之为“函数式接口”,但是…

如何创建虚拟硬盘 + os 读取硬盘参数代码

【0】README 0.1) 本文旨在演示如何利用 bximage 创建虚拟硬盘;0.2) 利用 os 读取硬盘参数, source code from orange’s implemention of a os , for complete code , please visit https://github.com/pacosonTang/Orange-s-OS…