【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 指令会同时释放事先被压栈的参数;

为什么引入TSS的更多相关文章

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

    [1]README 1.0)由于实现进程的切换任务,其功能涉及到 LDT + TSS +GATE + INTERRUPT:下面我们对这些内容进行复习: 1.1) source code from or ...

  2. 关于一致/非一致代码段与TSS 关系的个人看法

    [0]概念定义 0.1)一致代码段: 简单理解,就是操作系统拿出来被共享的代码段,可以被低特权级的用户直接调用访问的代码, 但是特权级高的程序不允许访问特权级低的数据. 通常这些共享代码,是" ...

  3. Windows内核中的CPU架构-8-任务段TSS(task state segment)

    Windows内核中的CPU架构-8-任务段TSS(task state segment) 任务段tss(task state segment)是针对于CPU的一个概念. 举一个简单的例子,你一个电脑 ...

  4. 谈谈DOMContentLoaded:Javascript中的domReady引入机制

    一.扯淡部分 回想当年,在摆脱写页面时js全靠从各种DEMO中copy出来然后东拼西凑的幽暗岁月之后,毅然决然地打算放弃这种处处“拿来主义”的不正之风,然后开启通往高大上的“前端攻城狮”的飞升之旅.想 ...

  5. NGINX引入线程池 性能提升9倍

    1. 引言 正如我们所知,NGINX采用了异步.事件驱动的方法来处理连接.这种处理方式无需(像使用传统架构的服务器一样)为每个请求创建额外的专用进程或者线程,而是在一个工作进程中处理多个连接和请求.为 ...

  6. Electron中Jquery的引入方式

    原文链接http://huisky.com/blog/16122220522957 Electron默认启用了Node.js的require模块,而jQuery等新版本框架为了支持commondJS标 ...

  7. iOS引入JavaScriptCore引擎框架(二)

    为何放弃第一种方案 UIWebView的JSContext获取     上篇中,我们通过简单的kvc获取UIWebVIew的JSContext,但是实际上,apple并未给开发者提供访问UIWebVi ...

  8. iOS引入JavaScriptCore引擎框架(一)

    JavaScriptCore引擎     我们都知道WebKit是个渲染引擎,简单来说负责页面的布局,绘制以及层的合成,但是WebKit工程中不仅仅有关于渲染相关的逻辑,也集成了默认的javascri ...

  9. C++01.类的引入

    1.假设我们要输出张三,李四两个人的基本信息,包括姓名,年龄,可以用以下的C程序实现: eg: #include <stdio.h> int main(int argc,char **ar ...

随机推荐

  1. MySql授权和撤销权限操作

    MySQL 赋予用户权限命令的简单格式可概括为: grant 权限 on 数据库对象 to 用户 用户后面可以加@'ip地址' identified by '密码' 例如: ' ' 上面的语句表示将 ...

  2. mysql-count与sum

    参考:https://www.jb51.net/article/141238.htm 建立时间临时辅助表:https://blog.csdn.net/qq_36226453/article/detai ...

  3. 小甲鱼PE详解之资源(PE详解11)

    原文出自:www.fishc.com 最近一直在安排第一届鱼C 学习班的事情,忙活了好一阵子,真是对不住大家,还大家久等了,这里要跟大家说声不好意思 ^_^ 今天我们来谈谈资源部分,资源部分可以说是 ...

  4. sourceInsight4 破解笔记(完美破解)【转】

    转自:http://www.cnblogs.com/Napoleon-Wang/p/6706773.html 软件下载地址:http://www.cr173.com/soft/421803.html ...

  5. 解决 GTK+/GNOME 3 环境下 Java Swing 程序使用本地 GTK+ 主题时菜单无边框 bug 的方法

    在 GTK+/GNOME 3 环境下采用默认的 Adwaita 主题时,Java Swing 程序如果使用本地 GTK+ 主题会出现菜单无边框的 bug,这个问题也可能在其他常用的 GTK+ 主题中出 ...

  6. Android Material Design系列之主题样式介绍说明

    今天这篇文章应该算是Material Design系列的补充篇,因为这篇文章本来应该放到前面讲的,因为讲的是主题嘛,对于一些状态和颜色的介绍,因为我们一新建一个项目时,系统自带了三个属性的颜色,现在就 ...

  7. selenium用法 (python)

    滑动到指定元素位置 browser.find_element_by_xpath("//font[text()='资产管理部经办人'][1]").location_once_scro ...

  8. 过滤器Filter_03_多个Filter的执行顺序

    过滤器Filter_03_多个Filter的执行顺序 学习了:https://www.cnblogs.com/HigginCui/p/5772514.html 按照在web.xml中的顺序进行filt ...

  9. 转: maven打可执行的jar包以及classpath设置

    from:  http://drizzlewalk.blog.51cto.com/2203401/416508

  10. grep 精确匹配

    使用grep实现精确过滤的五种方法 (1)当被过滤的内容占据一行时 [root@MySQL scripts]# cat oldboy.log        200 0200 2000 [root@My ...