临时笔记 Protection

如果操作系统不使用处理器的多任务机制,它仍然需要为栈创建至少一个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到栈中的。然而,

时间: 2024-12-27 10:23:55

临时笔记 Protection的相关文章

临时笔记

Python的虚拟环境可以使一个Python程序拥有独立的库library和解释器interpreter,而不用与其他Python程序共享统一个library和interpreter.虚拟环境的好处是避免了不同Python程序间的互相影响(共同使用global library 和 interpreter),例如程序A需要某个库的1.0版本,而程序B需要同样这个库的2.0版本,如果程序B执行则A就不能执行了. 安装virtualenv:    pip install virtualenv创建虚拟环

Python临时笔记

动态语言python的特性 python2  输入一个匿名函数直接执行 # coding=utf-8 def Test(a, b, func): result = func(a, b) return result func_new = input("please input a fun::") #please input a fun::lambda x,y:x+y print(Test(10, 20, func_new))#30 python3 会把input输入进去的东西全部转换成字

shell临时笔记

-eq 等于 -ne 不等于 -gt 大于 -ge 大于等于 -lt 小于 -le 小于等于 seq 1 30  从1到30的数字 touch -mt201003030303.03 $Dir    修改目录的时间格式 stat /tmp/1.dir                   查看修改时间 LINES=`grep '^#' $file |wc -l` echo "$file:$LINES"           //可以用多个变量   取结果要用``赋值给变量 cat file.

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

HashSet是一个集合,类似于DataSet,但是其主要用途是用来存放同一种类型的元素(string.row.table等),如果添加的元素跟定义时初始的类型不一致,就会直接编译失败. 例如: HashSet<string> hs=new HashSet<string>; bool result1=hs.add("aa");//返回true bool result2=hs.add("bb");//返回true bool result3=hs

SpringQuartz临时笔记

<!-- 要调用的工作类 --> <bean id="QuartzController" class="org.dbzy.analyse.controller.QuartzController"></bean> <!-- 定义调用对象和调用对象的方法 --> <bean id="jobtask" class="org.springframework.scheduling.quartz

个人笔记,对操作系统概念初步认识

临时笔记. 定义. 操作系统的最准确定义是没有的.操作系统主要面向用户,对硬件底层屏蔽,使用户不需要看见硬件的运行.操作系统对硬件管理.是属于用户和底层中的中间层. 主要功能. 操作系统对硬件资源有调度和公平分配的功能,对内存资源进行合理分配,使之进程在运行中得到最佳资源及性能.操作系统对CPU资源进行分配,利用高速的切换,用户无法察觉每个进程在分别使用CPU资源时的极其短暂暂停. 操作系统对用户态提供接口,使用户程序能通过接口与操作系统进行沟通,操作系统连接驱动程序,驱动程序对硬件进行控制,操

Angular Angular 部分2

临时笔记 太新了,现成的组件少, 自己封装一个 Angular UI 组件 Angular2采用自定义指令(Directive)方式加载jquery插件(别人跟着试了,无法实现) http://www.jb51.net/article/105121.htm 下面是几乎没有语法高亮的原文 http://www.cnblogs.com/liuyt/p/5810100.html AngularJS的组件封装 需求: 将一个Echarts封装成一个通用的AngularJS组件. 需求来源:Echarts

个人学习Linux决心书

我叫李遥,经过老男孩教育运维班5个月学习后,我一定要达到的薪水目标是13K.为了达到此目标,现要求如下:1.生活: 早晨6:30起床,学习30分钟,7:30出发. 晚上预计21:00开始学习,23:30开始睡觉. 2.学习: 攻略:合理利用学习时间,达到最佳吸收效果(专注). 1)5个月的日程表(3-7)--中长期规划 2)每月的日程表(3-7)--中短期规划 3)每日的日程表--短期规划 ★主体围绕:吸收知识 ★★完成老师要求的任务 牢记: >学习.思考:学而不思则罔,思而不学则殆. >复习

Docker迁移学习及其他

起因: 有在一台服务器A上通过docker搭建git服务,由于某些原因需要将其迁移到另一台服务器B. 过程: 最终采用方式: 首先通过docker ps(-a) 查看目标容器,然后通过commit命令将其提价为一个镜像,通过save命令将镜像转换为文件,将该文件从A上转移到B上,B上需要已经安装docker,通过load命令将文件转换为镜像,然后通过run启动镜像即可. 用到的命令有: docker ps docker commit -m "提交信息" -a "指定作者&qu