简述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