CPL(Current Privilege Level):
CPL是当前正在执行代码的特权级别。x86处理器使用CPL来决定对内存和其他系统资源的访问权限。
CPL在x86架构的处理器中存储在代码段寄存器(CS)的最低两位中。CS寄存器是代码段选择子的一部分,它包含了代码段的描述符索引和当前执行代码段的特权级别(CPL)。
CPL的取值范围是0到3,0表示最高特权级别,3表示最低特权级别。
通常,内核态运行的代码(例如操作系统内核)具有最高特权级别(CPL为0),而用户态程序具有较低特权级别(CPL为3)。
DPL(Descriptor Privilege Level):
DPL是存储在段描述符中的字段,用于指示段的特权级别。
在保护模式下,段描述符包含了段的访问权限信息,包括基地址、段限制和特权级别等。
DPL的取值范围也是0到3,与CPL相同。
当程序试图访问一个段时,CPU会根据该段的DPL和CPL来确定是否允许访问。
RPL(Requested Privilege Level):
RPL是在访问一个段时,由选择子(Selector)中的字段提供的请求特权级别。
选择子是段选择器(Segment Selector),由段寄存器(如CS、DS、ES等)中的内容构成。
RPL允许程序在不同特权级别之间进行切换。当程序在低特权级别(例如用户态)下尝试访问一个高特权级别(例如内核态)的段时,它可以通过设置选择子的RPL来请求权限。
当RPL大于或等于段描述符中的DPL时,访问将被允许,否则将会导致异常。
RPL 是段寄存器(段选择子)的低2位
DPL 是段描述符 高32位的第13-14位
CPL 是CS段寄存器的低2位
普通数据段: DS,ES,FS,GS. 堆栈数据段 SS
代码段 CS
CPU执行代码通过 cs段基址加上eip去地址读取指令执行
普通数据段 使用段描述符寻址时,先比较段选择子的RPL(请求特权级别)与段描述符的DPL(段特权级别)如果RPL小于等于DPL,再比较 CPL(当前特权级别) 与DPL(段特权级别),如果CPL也小于等于DPL那么就可以通过段描述符寻址。如果CPL或RPL有一个大于DPL那么就表示权限不够不能通过段描述符寻址。
普通数据段 使用段描述符寻址时,RPL>=DPL && CPL>=DPL才能够访问。
堆栈段使用段描述符寻址时 RPL=CPL= DPL才能够访问。