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中取得新的堆栈指针;调用返回时从被调用者堆栈中取得原堆栈指针进行恢复)。

时间: 2024-10-24 14:59:07

jmp && call && ret 特权级转移 & 进程调度的相关文章

第十八课 特权级转移(上)

这一节我们来研究从核心代码特权级转移到应用代码特权级. 首先将boot.asm贴出来如下: 1 org 0x7c00 2 3 jmp short start 4 nop 5 6 define: 7 BaseOfStack equ 0x7c00 8 BaseOfLoader equ 0x9000 9 RootEntryOffset equ 19 10 RootEntryLength equ 14 11 EntryItemLength equ 32 12 FatEntryOffset equ 1 1

任务和特权级保护

本文为<x86汇编语言:从实模式到保护模式> 第14章笔记 任务的隔离和特权级保护 任务, 任务的LDT和TSS 程序是记录在载体上的指令和数据, 总是为了完成某个特定的工作, 其正在执行中的一个副本, 叫做任务(Task). 这句话的意思是说, 如果一个程序有多个副本正在内存中运行, 那么, 它对应着多个任务, 每一个副本都是一个任务. 为了有效的在任务之间实施隔离, 处理器建议每个任务都应当具有自己的描述符表, 称为局部描述符表LDT, 并且把属于自己的那些段放到LDT中. 和GDT一样,

《一个操作系统的实现》读书笔记--第三章---不同特权级代码段之间的跳转

http://blog.csdn.net/begginghard/article/details/7262901 1.特权级 2.一致代码段和非一致代码段 3.DPL.RPL.CPL分别代表的含义,存储在什么位置,以及它们之间的关系 4.不同特权级数据段之间的访问规则 5.不同特权级代码段之间的转移 6.代码段之间的转移对堆栈的影响 7.结合pmtest5.asm来见证不同特权级代码段之间的跳转 一.特权级在IA32的分段机制下,特权级总共有4个特权级别,从高到低分别是0.1.2.3.数字越小表

任务的隔离和特权级保护

任务,任务的LDT和TSS ??程序是记录在载体上的指令和数据,其正在执行的一个副本,叫做任务(Task).如果一个程序有多个副本正在内存中运行,那么他对应多个任务,每一个副本都是一个任务.为了有效地在任务之间进行隔离,处理器建议每个任务都应该具有他自己的描述符表,称为局部描述符表LDT(Local Descriptor Table).LDT和GDT一样也是用来储存描述符的,但是LDT是只属于某个任务的.每个任务是有的段,都应该在LDT中进行描述,和GDT不同的是,LDT的0位也是有效的,也可以

第16课 - 保护模式中的特权级(中)

一种新的描述符:门描述符(Gate Descriptor) 通过门描述符在不同特权级的代码间进行跳转 根据应用场景的不同,门描述符分为: 调用门(Call Gates) 中断门(Interrupt Gates) 陷阱门(Trap Gate) 任务门(Task Gate) 门描述符的内存结构 每一个门描述符占用8字节内存 不同类项门描述的内存含义不同 调用门描述符(Call Gates)的定义 调用门描述符的工作原理 调用门描述符的使用 汇编小贴士 汇编语言中的跳转方式 段内跳转:call,jmp

保护模式特权级概述

在IA32的操作系统中,段被分为了4个特权级,分别为0-3级,有时候我们也叫做ring0-ring3,其中,数值越小特权级越高.如下图所示: 图中,核心代码和数据所在的段的特权级都比较高,一般在ring0,而用户程序所在的段的特权级较低,一般在ring3.当低特权级的任务试图在未被允许的情况下访问高特权级的段时,将会产生常规保护错误. 而处理器是如何区分所在段的特权级,进而对其进行保护的呢?这就不得不提到CPL.DPL和RPL三者了.但是在开始之前,我们需要先了解一下一致代码段和非一致代码段.

CPU特权级保护

1.特权级 1.1特权级 处理器段保护机制可以识别0-3共4级特权级,数值越大,特权越小.处理器通过识别CPL.DPL.RPL这三种特权级来进行特权级校验 (1)CPL:CPL是当前正在执行程序或任务的特权级.它存放在CS和SS段寄存器的0位和1位.通常CPL等于当前代码段的特权级.当程序把控制转移到另一个具有不同特权级的代码段中时,处理器就会改变CPL. (2)DPL:DPL是一个段或门的特权级别.它存放在段或门的描述符的DPL字段中.在当前执行代码段试图访问一个段或门时,段或门的DPL会用来

任务和特权级保护(二)——《x86汇编语言:从实模式到保护模式》读书笔记32

之前做了那么多铺垫,我们终于可以看看第14章的代码了. 对于引导代码和用户程序,依然采用第13章的:对于内核程序(c14_core.asm),编译的时候有几行报错了,只要加上dword即可解决. 1. 为什么要用调用门 在第13章,为了能使用内核提供的例程,用户程序是用call far指令直接转移到内核例程(非一致代码段).因为CPL=目标代码段描述符的DPL=RPL=0,符合下面表格的条件,所以转移是没有问题的. 但是在本章,用户程序工作在3特权级,而非0特权级,所以是无法直接转移的.不过也不

操作系统中的特权级检查

这里涉及到的几个概念:DPL.RPL.CPL DPL:存在于段描述符中,描述访问此段的最低特权级,即访问此段的进程CPL和RPL必须大于等于此段的DPL RPL:存在于段选择符中的最低两位,成为请求特权级即进程的请求权限,这个可以由程序员自己设置但是其功能受到CPL的制约 CPL:存在于cs和ss寄存器中的最低两位,是当前执行程序或者任务的特权级. 一个段描述符的DPL为0表示只允许内核层的进程访问,为3表示允许任意进程访问. 在实模式下,由于段寄存器是16位的,地址线有20根,当时的寻址是通过