jmp && call && ret 特权级转移 & 进程调度
①jmp是不负责任的调度,不保存任何信息,不考虑会回头。跳过去就什么也不管了。
②call,保存eip等,以便程序重新跳回。ret是call的逆过程,是回头的过程。这都是cpu固有指令,因此要保存的信息,不用我们自己保存。我们直接使用指令即可
③同一任务内特权级转移,跟 ②差不多,不过要准备个tss,并加载它,然后call 门一下就行了。
④进程调度,进程的界限是我们人为加上的,cpu并不知道进程要切换了,也没有特定的进程指令。因此进程的状态需要我们自己保存。
上面的关系好像是在盖房子,越盖越高,越盖越复杂。
jmp与call
Jmp指令仅仅进行执行流程的跳转,不会保存返回地址。
Call指令在进行流程跳转前会保存返回地址,以便在跳转目标代码中可以使用ret指令返回到call指令的下一条指令处继续执行。执行段内跳转时,只保存EIP;如果是段间跳转,还保存CS。
对于使用Call指令(无论是直接调用还是通过调用门)进行的跳转,如果跳转后特权级别将发生改变(总是从低到高,从上述第2点知道,只有跳转到非
一致码段时才会发生特权级别变化),则执行call指令前必须准备好任务状态段TSS。跳转过程是:(1)保存调用者的SS和ESP到被调用者堆栈中
(2)调用参数先保存在调用者堆栈中,然后被复制到被调用者堆栈中(3)当前CS和EIP被保存到被调用者堆栈中。在通过call进行的有特权级别变化的
跳转中,堆栈会发生切换,这时要保存当前堆栈指针(SS:ESP),而当前指令指针(CS:EIP)保存到新的堆栈(被调用者堆栈)中,这是与没有特权级
别变化的跳转不同的。没有特权级别变化时,不需要保存SS:ESP,不存在调用参数的复制,不存在堆栈切换。
ret和retf
这两个指令的功能都是调用返回。
(1) ret在返回时只从堆栈中取得EIP;retf中的字母f表示far,即段间转移返回,要从堆栈中取得EIP和CS。
(2)两个指令都可以带参数,表示发生过程调用时参数的个数,返回时需要从堆栈中退出相应个数的参数
(3)恢复CS时,如果发现将发生特权级别变化(当前CS的低2位不等于从堆栈中取得的新的CS值的低2位。从上述第2点知道,只有跳转到非一致码
段时才会发生特权级别变化,那么,也只有从非一致码段返回时才会发生特权级别返回),则还要从调用者堆栈中取得ESP和SS恢复到相应寄存器中,也即恢复
调用者堆栈。
任务状态段TSS
为避免相互干扰,要求不同特权级别的代码运行时使用不同的堆栈,也就是在特权级别发生改变时必须切换堆栈段。0、1、2特权级别的堆栈指针保存在
TSS中,在跳转到相应级别时从TSS中取出相应的堆栈指针进行堆栈切换。因为只有从低特权级别跳转到高特权级别时才需要从TSS中取得新的堆栈指针,所
以TSS中不存在最低特权级别3的堆栈指针。
综上所述,所有的复杂只有一点:仅仅在通过调用门从低特权级别跳转到高特权级别的非一致码段时,才会发生CPL改变,才需要先准备好TSS,才会发生堆栈切换(在调用前从TSS中取得新的堆栈指针;调用返回时从被调用者堆栈中取得原堆栈指针进行恢复)。
jmp && call && ret 特权级转移 & 进程调度的更多相关文章
- 高特权级代码段转向低特权级代码段(利用 ret(retf) 指令实现 jmp from ring0 to ring3)
[0]写在前面 0.1)本代码旨在演示 从 ring0 转移到 ring3(即,从高特权级 转移到 低特权级) 0.2)本文 只对 与 门相关的 代码进行简要注释,言简意赅: 0.3)文末的个人总结是 ...
- CPU Rings, Privilege, and Protection.CPU的运行环, 特权级与保护
原文标题:CPU Rings, Privilege, and Protection 原文地址:http://duartes.org/gustavo/blog/ [注:本人水平有限,只好挑一些国外高手的 ...
- 特权级概述(哥子就想知道CPU是如何验证特权级的)GATE+TSS
[0]README text description from orange's implemention of a os . [1]特权级概述 当当前代码段试图访问一个段或者门时,目标段的DPL将会 ...
- Linux从头学12:读完这篇【特权级】文章,你就比别人更“精通”操作系统!
作 者:道哥,10+年嵌入式开发老兵,专注于:C/C++.嵌入式.Linux. 关注下方公众号,回复[书籍],获取 Linux.嵌入式领域经典书籍:回复[PDF],获取所有原创文章( PDF 格式). ...
- RTX——第9章 任务运行在特权级或非特权级模式
以下内容转载自安富莱电子: http://forum.armfly.com/forum.php 本章教程为大家讲解 RTX 运行模式的一个重要知识点,特权级模式和非特权级模式,有些资料或者书籍将非特权 ...
- 汇编指令之JMP,CALL,RET(修改EIP的值!!!)
简单介绍了,JMP指令按市面上的意思来说是跳转到指定地址,但我这里不这么说,JMP, CALL, RET三个指令均为修改EIP值的指令,EAX, ECX, EBX, EDX, ESP, EBP, ES ...
- 通过调用门进行有特权级变换的转移,详细注解 对pmtest5.asm解释很详细.
http://www.myexception.cn/operating-system/484288.html http://www.myexception.cn/operating-system/44 ...
- [汇编语言]-第九章 根据位移进行转移的jmp指令 段内短转移 段内近转移 段间转移(远转移) 转移的目的地址在指令中,在寄存器中,在内存中的jmp指令
1- jmp为无条件转移指令,可以只修改IP, 也可以同时修改CS和IP jmp指令要给出两种信息: (1) 转移的目的地址 (2) 转移的距离(段间转移, 段内转移, 段内近转移) 2- 依据位移进 ...
- JMP CALL RET
一.JMP指令(修改EIP的值)(第一个修改EIP的指令) 三种方法 :JMP 立即数 JMP 寄存器 JMP 内存 EIP 之前介绍过,EIP存放的值就是cpu下一次要执行的地址 1.之前学过要 ...
随机推荐
- C#的提交表单方式WebClient
向网站提交页面的主要代码 string postString = "arg1=a&arg2=b";//这里即为传递的参数,可以用工具抓包分析,也可以自己分析,主要是form ...
- form提交数据中文乱码问题总结
一:form在前台以post方式提交数据: 浏览器将数据(假设为“中国”)发送给服务器的时候,将数据变成0101的二进制数据(假设为98 99)时必然要查码表,浏览器以哪个码表打开网页,浏览器就以哪个 ...
- Android第三方授权(新浪微博篇)
Android第三方认证新浪微博,相对微信,也比较简单,并且sina给了一个sdk和sdkdemo,这个demo封装了许多,但是自己不准备记录这个demo,而是直接使用sdk 同样去sina官方下载s ...
- [Entity Framework] MySQL @ Entity Framework 6
原文 [Entity Framework] MySQL @ Entity Framework 6 要让MySQL能够用EF6,我花了一点时间,在此记录一下 安装元件 在设定档加入Provider 安装 ...
- spring aop配置及用例说明(2)
欢迎交流转载:http://www.cnblogs.com/shizhongtao/p/3473362.html 这里先介绍下几个annotation的含义, @Before:表示在切入点之前执行. ...
- Go 接口转换的一个例子
今天将Go 的websocket集成到已有的http中时也遇到以下一个问题:其中主要是接口类型转换 转载自[http://www.cnblogs.com/ghj1976/archive/2013/04 ...
- JBoss部署项目log4j配置会造成死锁问题,浏览器访问一直pending状态
今天将项目部署到JBoss服务器上,部署成功后,浏览器访问页面一直在等待响应. 查了很长时间,最后在服务器上通过jstack pid命令查看Java堆栈信息,发现了有两个线程死锁. 看到造成死锁的原因 ...
- iOS 非ARC基本内存管理系列 4-autorelease方法和@autoreleasepool
1.autorelease 基本用法 对象执行autorelease方法时会将对象添加到自动释放池中 当自动释放池销毁时自动释放池中所有对象作release操作 对象执行autorelease方法后自 ...
- vi 技巧
:%s/^/\// 行首加 / :%s/$/\// 行尾加/ :%s/^\///g 行首减 / :%s/\/$//g 行尾减/ :%s/^\s*//g 行首减 空格
- jQuery—一些常见方法(1)【filter(),not(),has(),next(),prev(),find(),eq(),index(),attr(),】
1.filter()和not()方法 filter()和not()是一对反方法,filter()是过滤. filter()方法是针对元素自身.(跟has()方法有区别) <script type ...