代码段之间转移控制时的特权级检查

对于将程序控制权从一个代码段转移到另一个代码段,目标代码段的选择符必须加载进代码段寄存器中。作为这个加载过程的一部分,处理器会检测目标代码段的段描述符并执行各种限长、类型和特权级检查。如果这些检查都通过了,则目标代码段选择符就会加载进CS寄存器,于是程序的控制权就被转移到新的代码段中,程序将从EIP寄存器指向的指令处开始执行。

程序的控制转移指令JMP、RET、CALL和IRET以及异常和中断机制来实现。异常和中断是一些特殊实现。JMP和CALL指令可以利用以下四种方法之一来引用另外一个代码段:

  • 目标操作数含有目标代码的段选择符。
  • 目标操作数指向一个调用门描述符,而该描述符中含有目标代码段的选择符。
  • 目标操作数指向一个TSS(任务状态段),而该TSS中含有目标代码段的选择符。
  • 目标操作数指向一个任务门,该任务门指向一个TSS,而该TSS中含有目标代码段的选择符

下面描述前两种引用类型。

直接调用或跳转到代码段

JMP、CALL和RET指令的近转移形式只是在当前代码段中执行程序控制转移,因此不会执行特权级检查。JMP、CALL或RET指令的远转移形式会把控制转移到另外一个代码段中,因此处理器一定会进行特权级检查。

当不通过调用门把程序控制权转移到另一个代码段时,处理器会验证4种特权级和类型信息,如下图所示:

825979-20180605194734301-1082830780.png

  • 当前特权级CPL,这里CPL是执行调用的代码段的特权级,即含有执行调用或跳转程序的代码段的CPL。
  • 含有被调过程的目的代码段描述符中的描述符特权级DPL。
  • 目的代码段的段选择符中的请求特权级RPL。
  • 目的代码段描述符中的一致性标志C,它确定了一个代码段是非一致代码段还是一致代码段

处理器检查CPL、RPL和DPL的规则依赖于一致性标志C的设置状态。 当访问非一致代码段时(C=0),调用者的CPL必须等于目的代码段的DPL,否则将会产生一般保护异常。执行非一致代码段的段选择符的RPL对检查所起的作用有限。RPL在数值上必须小于或等于调用者的CPL才能使得控制转移成功完成。当非一致代码段的段选择符被加载进CS寄存器中时,特权级字段不会改变,即它任然是调用者的CPL。即使段选择符的RPl与CPl不同,这也是正确的。

当访问一致代码段时(C=1),调用者的CPL可以在数值上大于或等于目的代码段的DPL。仅当CPL<DPL,处理器才会产生一般保护异常。对于访问一致代码段,处理器忽略对RPL的检查。对于一致代码段,DPL表示调用者对代码段进行成功调用可以处于的最低数值特权级。

当程序控制被转移到一个一致代码段中,CPL并不改变,即使目的代码段的DPL在数值上小于CPL。这是CPL可能与当前代码段DPL不相同的唯一一种情况。同样,由于CPL没有改变,因此堆栈也不会切换。

大多数代码段都是非一致代码段。对于这些段,程序的控制权只能转移到具有相同特权级的代码段中,除非是通过一个调用门进行。

门描述符

为了对具有不同特权级的代码段提供受控的访问,处理器提供了称为门描述符的特殊描述符集,共有四种描述符:

  • 调用门(Call Gate),类型 TYPE=12;
  • 陷阱门(Trap Gate),类型 TYPE=15;
  • 中断门(Interrupt, Gate),类型 TYPE=14;
  • 任务门(Task Gate),类型 TYPE=5.

任务门用于任务切换,陷阱门和中断门时调用门的特殊类,专门用于调用异常和中断的处理程序。

调用门用于在不同特权级之间实现受控的程序控制转移。他们通常仅用于使用特权级保护机制的操作系统中。调用门描述符可以存放在GDT或LDT中,但是不能放在中断描述符表IDT中,一个调用门主要具有以下几个功能:

  • 指定要访问的代码段
  • 指定代码段中定义过程的一个入口点(就是代码段中程序的入口点)
  • 指定访问过程的调用者需具备的特权级
  • 若会发生堆栈切换,它会指定在堆栈之间需要复制的可选参数个数
  • 指明调用门描述符是否有效。

调用门描述符格式如下所示:

825979-20180605201449600-1009866402.png

调用门中的段选择符指定要访问的代码段。偏移地址指定段中入口点,这个入口点通常是指定过程的第一条指令。DPL字段指定调用门的特权级,从而指定通过调用门访问特定过程所要求的特权级。标志P指明调用门描述符是否有效。参数个数字段指明发生堆栈切换时从调用者堆栈复制到新堆栈中的参数个数。

通过调用门访问代码段

为了访问调用门,我们需要为CALL或JMP指令的操作数提供一个远指针。该指针的段选择符用于指定调用门,而指针的偏移值虽然需要但是CPU并不会用它,该偏移值可以设置为任意值。

当处理器访问调用门时,它会使用调用门中的段选择符来定位目的代码段的段描述符。然后CPU会把代码段描述符的基地址与调用门中的偏移地址进行组合,形成代码段中指定程序入口点的线性地址。调用门调用过程如下图所示:

825979-20180605203510256-1557851901.png

通过调用门进行程序控制转移时,CPU会对4种不同的特权级进行检查,以确定控制转移的有效性

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值