cs, ds、es丸凭、ss的值钙蒙,段選擇子
段選擇子16位:索引號13位茵瀑,T1(1位):T1=0時指向GDT,T1=1時指向LDT躬厌,RPL(2位)請求特權(quán)級
[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:請求特權(quán)級
在訪問一個段的時候,CPU有兩個必須執(zhí)行的檢查疙渣。
只有在以下兩種情況都是正確的情況下匙奴,才能訪問:
CPL <= DPL
RPL <= DPL
CPL是代碼本身的訪問權(quán)限級別
DPL是數(shù)據(jù)的保密級別
1、當(dāng)前特權(quán)CPL(Current Privilege Level)CPL是當(dāng)前進(jìn)程的權(quán)限級別妄荔,是當(dāng)前正在執(zhí)行的代碼所在的段的特權(quán)級泼菌,存在于cs寄存器的低兩位;
2啦租、描述符特權(quán)級DPL(Descriptor Privilege Level)哗伯,DPL存儲在段描述符中,規(guī)定該段的權(quán)限級別篷角,每個段的DPL固定焊刹。
3、RPL的值由程序員自己來自由的設(shè)置恳蹲,并不一定RPL>=CPL虐块,但是當(dāng)RPL<CPL時,實際器作用的就是CPL了阱缓。
因此訪問時的特權(quán)檢查時判斷:
EPL = max(RPL, CPL) <= DPL是否成立非凌,
RPL=0時附加限制最小,
RPL=3時附加限制最大荆针。
打印DPL
/* 存儲段描述符/系統(tǒng)段描述符 */
typedef struct s_descriptor { /* 共 8 個字節(jié) */
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)
153 = 10011001 DPL是0
147 = 10010011 DPL是0
所以都在r0特權(quán)級敞嗡!