- DPL
- 特权级描述符(Descriptor Privilege Level)
- 对于数据段来说,DPL决定了访问它们所应当具备的最低特权级别。
- CPL
- 当前特权级(Current Privilege Level)
- 当前处理器正在一个代码段中取指令和执行指令,这个代码段的特权级就是当前的特权级。
- IOPL
- I/O Privilege Level,位于EFLAGS中。
- 运行规则
- 非依从代码段,只能在相同DPL的段中执行。
- 依从代码段中,若满足条件
CPL >= 目标代码段描述符的DPL
,则可以转移到目标代码段进行执行,但是CPL
不会改变,是为"依从"。
- 门(Gate)
- 段描述内存段,门描述可以执行的代码。
- 调用门(Call Gate)
jmp far 调用门描述符的选择子
转移到比当前特权高的代码段,但当前特权级不变。call far
同样转移到目标代码段,但是当前特权级提升。
- RPL
- 请求特权级(Requested Privilege Level)
- 用户程序通过调用门进行特权提升之后,用RPL来判断原始请求是否有资格来进行相关操作,RPL相当于是一个通信证,这个通行证由操作系统来发放。
规则
- 代码段
- 直接转移到非依从
CPL = 目标代码段描述符的DPL
&&RPL = 目标代码段描述符的DPL
- 直接转移到依从
CPL >= 目标代码段描述符的DPL
&&RPL >= 目标代码段描述符的DPL
- 直接转移到非依从
- 数据段
- 高特权级别的程序可以访问低特权级别的数据段
CPL <= 目标数据段描述符的DPL
&&RPL <= 目标数据段描述符的DPL
- 栈段
CPL = 目标栈段描述符的DPL
&&RPL = 目标栈段描述符的RPL
- 调用门
call far
CPL <= 调用门描述符的DPL
RPL <= 调用门描述符的DPL
- 对于依从和非依从的代码段
CPL >= 目标代码段描述符的DPL
jmp far
CPL <= 调用门描述符的DPL
RPL <= 调用门描述符的DPL
- 对于依从的代码段
CPL >= 目标代码段描述符的DPL
- 对于非依从的代码段
CPL = 目标代码段描述符的DPL
- note:试想如果当前
CPL < 目标代码段描述符的DPL
,操作系统应当认为特权级别越高的代码越是可靠,所以不会允许高等级代码段转移到低等级的代码段运行。
Q&A
- 程序在进行任务切换时特权级是怎么更改的?