如果操作系统不使用处理器的多任务机制,它仍然需要为栈创建至少一个TSS

  当程序通过调用门改变特权级的时候,处理器执行下面的步骤切换栈,并且执行被调用的程序在新的特权级

  1.  使用目标代码段的DPL从TSS中选择栈段选择子和栈指针

  2.  从当前TSS读取被切换的栈段选择子和栈指针。当读取栈段选择子,栈指针或者栈段描述符的时候,任何界限违规都会造成#TS异常

  3.  检测栈段描述符的类型和特权级是否正确,如果违规了,则会产生#TS异常

  4.  暂时保存当前的SS和ESP寄存器的值

  5.  加载新栈的段选择子和栈指针到SS和ESP寄存器

  6.  把暂时被保存的SS和EIP寄存器的值压入新栈

  7.  从调用者的栈复制调用门的参数数量字段指定的参数个数到新栈。如果参数数量是0,则没有参数被复制

  8.  把返回指令指针(当前CS和EIP寄存器的值)压入到新栈

  9.  加载新代码段的段选择子和调用门中指定的指令指针到CS和EIP寄存器,然后开始执行被调用的程序

  总结:选择->读取->加载SS和ESP->压入调用者的SS和ESP->压入调用者的参数->压入返回指令指针->加载目标代码段的地址到CS和EIP中->go

  调用门中的参数数量字段指定了处理器应该从调用者栈复制到被调用程序栈的数据项数量(最多31个数据项),如果数据项超过31位被复制,参数可以成为指向数据结构的指针,或者被保存的SS和EIP寄存器的内容可以用于访问旧栈中的参数,数据项被复制的size取决于调用门的size

  

5.8.6  从被调用的程序中返回

  RET指令能用于执行近返回,同等特权级的远返回,和不同特权级的远返回. 这个指令主要用于从曾经用CALL指令调用的被调用过程中返回。它不支持从JMP指令返回,因此JMP指令不在栈上保存返回指令指针

  近返回紧急转移程序控制在当前代码段内;因此,处理器紧急执行界限检查,当处理器从栈中POP返回指令指针到EIP寄存器中时,它会检查指针是否会超过当前代码段的界限

  同等特权级的远返回上,处理器从栈上Pop被返回的代码段的段选择子和返回指令指针。正常环境下,这些指针应该是有效的,因为它们是通过CALL指令PUSH到栈中的。然而,

临时笔记 Protection的更多相关文章

  1. C#之 HashSet(临时笔记,未参考资料,请慎重)

    HashSet是一个集合,类似于DataSet,但是其主要用途是用来存放同一种类型的元素(string.row.table等),如果添加的元素跟定义时初始的类型不一致,就会直接编译失败. 例如: Ha ...

  2. 临时笔记:flume+ CDH 的 twitter实例

    http://www.slideshare.net/OpenAnayticsMeetup/analyzing-twitter-data-with-hadoop-17718553 http://www. ...

  3. unity 人工智能AI,装备解锁临时笔记

    A*算法的一种改进设想:1.如何让角色到达目标点的过程中更加平滑:获取一串到达目标点的网格串之后,就实时用带形状的物理射线检测能否直接到达下一个目标点的再下一个目标点,如果能到达,那么直接朝该方向运动 ...

  4. activiti 临时笔记mark

    public class TenMinuteTutorial { public static void main(String[] args) { // Create Activiti process ...

  5. vue学习第四天 ------ 临时笔记

    1.驼峰写法 在html标签中,由于html的特性是不区分大小写(比如LI和li是一样的),因此,html标签中要传递的值要写成短横线式的(如btn-test),以区分大小写. 在props的数组中, ...

  6. vue学习第三天 ------ 临时笔记

    说明:之前两天属于入门,文章可能存在片段信息 vue2.x+webpack快速搭建前端项目框架详解 http://www.jb51.net/article/129463.htmVue cli + We ...

  7. vue学习第二天 ------ 临时笔记

    学习链接: vue.js官方文档: https://cn.vuejs.org/v2/guide/index.html vue.js API: https://cn.vuejs.org/v2/api/# ...

  8. vue学习第一天 ------ 临时笔记

    学习链接 Vue2+VueRouter2+Webpack+Axios 构建项目实战2017重制版(一)基础知识概述 http://blog.csdn.net/fungleo/article/detai ...

  9. Python临时笔记

    动态语言python的特性 python2  输入一个匿名函数直接执行 # coding=utf-8 def Test(a, b, func): result = func(a, b) return ...

随机推荐

  1. FOUNDATION OF ASYNCHRONOUS PROGRAMMING

    The async and await keywords are just a compiler feature. The compiler creates code by using the Tas ...

  2. Lightoj 1023 - Discovering Permutations

    1023 - Discovering Permutations    PDF (English) Statistics Forum Time Limit: 0.5 second(s) Memory L ...

  3. 深入理解JMM(Java内存模型) --(一)

    并发编程模型的分类 在并发编程中,我们需要处理两个关键问题:线程之间如何通信及线程之间如何同步(这里的线程是指并发执行的活动实体).通信是指线程之间以何种机制来交换信息.在命令式编程中,线程之间的通信 ...

  4. 无线 WIFI 的13个信道频率范围(转载)

    转自:http://cnzhx.net/blog/13-channels-of-wifi/ 目前主流的无线WIFI网络设备不管是802.11b/g还是802.11b/g/n 一般都支持13个信道.它们 ...

  5. MHA高可用 MHA+Keepalive

    MHA高可用 MHA简介 MHA(Master High Availability)目前在MySQL高可用方面是一个相对成熟的解决方案,它由日本DeNA公司youshimaton(现就职于Facebo ...

  6. 洛谷 P1941 飞扬的小鸟【dp】

    设f[i][j]为在坐标(i,j)时的最小点击次数,转移的话从i-1向上飞或者向下掉转移,注意转移完了之后要把管子部分赋值为inf #include<iostream> #include& ...

  7. 洛谷P4550 收集邮票(概率期望)

    传送门 神仙题啊……这思路到底是怎么来的…… ps:本题是第$k$次买邮票需要$k$元,而不是买的邮票标号为$k$时花费$k$元 我们设$g[i]$表示现在有$i$张,要买到$n$张的期望张数,设$P ...

  8. Lodash 方法库 原生实现 待完结。。。

    'use strict' let _ = { // 将数组(array)拆分成多个 size 长度的区块,并将这些区块组成一个新数组. 如果array 无法被分割成全部等长的区块,那么最后剩余的元素将 ...

  9. ROS学习笔记十二:使用gazebo在ROS中仿真

    想要在ROS系统中对我们的机器人进行仿真,需要使用gazebo. gazebo是一种适用于复杂室内多机器人和室外环境的仿真环境.它能够在三维环境中对多个机器人.传感器及物体进行仿真,产生实际传感器反馈 ...

  10. Poj 3294 Life Forms (后缀数组 + 二分 + Hash)

    题目链接: Poj 3294 Life Forms 题目描述: 有n个文本串,问在一半以上的文本串出现过的最长连续子串? 解题思路: 可以把文本串用没有出现过的不同字符连起来,然后求新文本串的heig ...