保护模式下的特权级转换总结
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).