cs, ds、es、ss的值,段选择子
段选择子的值
段选择子16位:索引号13位,T1(1位):T1=0时指向GDT,T1=1时指向LDT,RPL(2位)请求特权级
[cs: 8] 0000 0000 0000 1000 索引号:1,T1:0,RPL:0
[ds:16] 0000 0000 0001 0000 索引号:2,T1:0,RPL:0
[es:16]
[ss:16]
RPL:请求特权级
在访问一个段的时候,CPU有两个必须执行的检查。
只有在以下两种情况都是正确的情况下,才能访问:
CPL <= DPL
RPL <= DPL
CPL是代码本身的访问权限级别
DPL是数据的保密级别
1、当前特权CPL(Current Privilege Level)CPL是当前进程的权限级别,是当前正在执行的代码所在的段的特权级,存在于cs寄存器的低两位;
2、描述符特权级DPL(Descriptor Privilege Level),DPL存储在段描述符中,规定该段的权限级别,每个段的DPL固定。
3、RPL的值由程序员自己来自由的设置,并不一定RPL>=CPL,但是当RPL<CPL时,实际器作用的就是CPL了。
因此访问时的特权检查时判断:
EPL = max(RPL, CPL) <= DPL是否成立,
RPL=0时附加限制最小,
RPL=3时附加限制最大。
打印DPL
/* 存储段描述符/系统段描述符 */
typedef struct s_descriptor { /* 共 8 个字节 */
uint16 limit_low; /* Limit */
uint16 base_low; /* Base */
uint8 base_mid; /* Base */
uint8 attr1; /* P(1) DPL(2) DT(1) TYPE(4) */
uint8 limit_high_attr2; /* G(1) D(1) 0(1) AVL(1) LimitHigh(4) */
uint8 base_high; /* Base */
} __attribute__((packed)) DESCRIPTOR;
P(1) DPL(2) DT(1) TYPE(4)
DPL
153 = 10011001 DPL是0
147 = 10010011 DPL是0
所以都在r0特权级!