简述RPL, DPL, CPL的区别与联系

简述RPL, DPL, CPL的区别与联系

基本概念

RPL: Requested Privilege Level, 请求特权级 DPL: Descriptor Privilege Level,描述符特权级 CPL: Current Privilege Level,当前特权级

区分RPL和CPL

可能有很多博客或者文章上面都有讲到RPL和CPL,那么这两者到底有什么区别和联系呢: 1. RPL存在于段选择子(Segment Selector)中,CPL存在于段寄存器中,如(CS, SS, DS) 2. RPL和CPL都占用2个bit, 取值范围0~3, 值越小,特权级越高 但是问题又出现了,段选择子与段寄存器之间又有什么关系呢? 看下面的代码,你可能就比较清楚了:

lgdt gdtdesc

movl %cr0, %eax

orl $CR0_PE_ON, %eax

movl %eax, %cr0

ljmp $PROT_MODE_CSEC, $protcseg

上面的这一段代码的主要作用是从实模式切换到保护模式,其中$PROT_MODE_CSEC就是段选择子。 ljmp在跳转时会把段选择子赋值给段寄存器。这样,你应该清楚它们之间是什么关系了吧。

RPL, CPL与DPL实现数据段保护

DPL存在于段描述符(Segment Descriptor)中,代表着要访问当前数据或者是代码段所需要的特权等级。 CPL是当前代码的特权级,RPL是你请求的特权级,简单的说,只有当max(RPL, CPL) <= DPL时,访问才能成功. 例如:

DPL = 2, CPL = 0, RPL = 3, 访问失败 虽然当前所有的特权级CPL很高,但RPL很低,就像你是level 1的,你偏要告诉别人你是level 3的,那当然没人买你的帐。

另外简单说段选择子的结构:

Bit 0 ~ Bit 1: RPL

Bit 2: TI(Table indicator), 0-GDT, 1-LDT

Bit 3 ~ Bit15: Index of table