IA32的分段机制中,特权级总共有4个特权级别,分别是0,1,2,3。数字越小表示特权级越大。DPL和RPL都是用来表示特权级别的。
见上图 ,较为核心的代码和数据,被放在特权级较高的层级中。处理器将这样的机制来避免低特权级的任务在不被允许的情况下访问位于高特权级的段。如果处理器检测到一个访问请求不是合法的,将会产生常规保护错误(#GP)
处理器通过识别CPL、DPL、RPL这3中特权级别进行特权级别检查。
1.CPL(Current Privilege Level)
CPL是当前执行的程序或任务的特权级。它被存储在CS和SS的第0位和第1位上。在通常情况下,CPL等于代码所在的段的特权级。当程序转移到不同特权级的代码段时,处理器将改变CPL。
但是有个例外是一致代码段,一致代码段可以被相同或者更低特权级的代码访问,当处理器访问一个与CPL特权级不同的一致代码段时,CPL不会改变。
2.DPL(Descriptor Privilege level)
DPL表示段或者门的特权级。它被存储在段描述符或者门描述符的DPL中,当当前代码段试图访问一个段或者门时,DPL将会和CPL以及段或门选择子的RPL相比较。下面是各种类型的段或者门的情况:
数据段:
DPL规定可以访问此段的最低特权级。只有运行在CPL<=DPL程序才有权访问。比如一个数据段的DPL是1,只有运行在CPL为0或者1的程序才有权访问。
非一致代码段(不使用调用门&#