jmp,call,ret,特权级转移,进程调度
来源:互联网 发布:应届毕业生找工作知乎 编辑:程序博客网 时间:2024/06/10 16:42
①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,特权级转移,进程调度
- 不同特权级间代码段的跳转{ 门 + 跳转(jmp + call) + 返回(ret) }
- jmp、call、ret、retf解析
- 汇编指令jmp call ret 变形
- 【汇编】jmp、call、ret、retf比较
- 跳转指令 jmp、call、ret、retf
- 代码段间转移控制时的特权级检查(JMP/CALL)——《x86汇编语言:从实模式到保护模式》读书笔记28
- 高特权级代码段转向低特权级代码段(利用 ret(retf) 指令实现 jmp from ring0 to ring3)
- 转移指令jmp和跳转指令call
- 汇编语言 JMP CALL RET RETF的使用与区别
- 特权级转移总结
- 操作系统实现----多进程(无特权级转移)
- 操作系统实现---多进程(有特权级转移)
- Vol3.5.8.1 直接CALL或JMP到目的代码段时的特权级检查[5.8.1 Direct Calls or Jumps to Code Segments]
- 读王爽老师汇编语言笔记---转移指令的原理和call,ret指令
- 特权级代码段之间的转移---任务内无特权级变换的转移
- 特权级代码段之间的转移---任务内特权级变换转移
- 关于CALL和RET
- xxxx.c文件解析
- 小米笔试最后一题
- xCHM
- MFC拆分窗口详述
- Android系统源代码情景分析:基础知识
- jmp,call,ret,特权级转移,进程调度
- 编码一致性问题
- eclipse 插件关系分析器
- 豆瓣流行日志400
- 注册界面的4种HTML结构
- vector容器的内存分配——vector向量容器(补充)——STL Introduction
- 使用VC6.0实现窗口的任意分割
- 让android 2.x 也能使用actionbar -- actionbarsherlock的使用(二)
- 各种文件读取方法