【特权级分析】

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

因此访问时的特权检查时判断:
EPL = max(RPL, CPL) <= DPL是否成立,
RPL=0时附加限制最小,
RPL=3时附加限制最大。

https://blog.csdn.net/MOOD/article/details/4623763?utm_medium=distribute.wap_relevant_bbs_down.none-task-other-baidujs-1.nonecase&depth_1-utm_source=distribute.wap_relevant_bbs_down.none-task-other-baidujs-1.nonecase

打印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特权级!

你可能感兴趣的:(【特权级分析】)