保护模式下的特权级转换总结

1 首先要说明的是 “一致代码段和非一致代码段” 的概念。

“一致”的意思是这样的:

  • 当转移的目标是一个特权级更高的一致代码段(CPL<=DPL,RPL<=DPL(级别的高低,不是数字的大小)),当前的特权级会被延续下去,CPL不变。
  • 而向特权级更高的非一致代码段的转移会引起常规保护错误。

说明:

  • 代码段是否为一致代码段的属性是在规定GDT表的Descriptor的属性选项规定的。
  • 数据段都是非一致的。

利用call和jmp总结:

  • 向非一致代码段访问,只能访问同一特权级别的,要真想访问其他级别的,使用调用门和retd。
  • 向一致代码段访问,只能Low->High  or Same Privilege,High->Low是引起常规保护错误的。
  • 向数据段访问,High->Low or Same Privilege,Low->High是引起常规保护错误。

 

2 DPL表示或者门的特权级,被存储在段描述符或者门描述符的DPL字段中。

数据段、调用门、TSS
  DPL规定了可以访问此段的最低特权级。即特权级>=DPL才能访问成功

通过调用门访问的非一致代码段
  DPL规定了可以访问此段的最高特权级。即特权级<=DPL才能访问成功

  • 解释:比如想通过调用门从低级别向高级别访问,不妨设低级别为代码A,高级别为代码B,调用门G。会有2次特权级的判定,先是特权级>=DPL_G.然后如果第一条成立,说明刚刚能接触调用门,至于调转成功否还未知。还要DPL_B>=特权级,才能够实现跳转的成功。

 

3 CPL(Current Privilege Level)是当前执行的程序或任务的特权级。它被存储在cs和ss的第0位和第1位上。个人认为可以看成是段描述符未加载入CS前,该段的DPL,加载入CS后就存入CS的低两位,所以叫做CPL,其值就等于原段DPL的值。特例一致代码段访问除外

4 RPL(Requested Privilege Level)是存储在段选择子的第0位和第1位中的。

段2中红字标出的特权级意思是:min(CPL, RPL).

 

 

 

 



posted @ 2011-09-04 20:54  Jack204  阅读(1182)  评论(0编辑  收藏  举报