保護模式-段描述符屬性
阿新 • • 發佈:2018-12-09
- 段暫存器位96位但是可見位數只有16位,剩下80位怎麼填充?80位裡每一位代表什麼意思?
上面為段描述符的結構
- P(15):
- P=1 段描述符有效
- P=0 段描述符無效
- G(23):
我們先看看段描述符的結構
Struct SegMent { WORD Select; //16位段選擇子 WORD Attributes; //16位屬性 DWORD Base; //32位基址 DWORD Limit; //32位段限長 }
除去16位段選擇子,剩下16位屬性,32位基址,32位段限長,16+32+32為80位 段基址位(0-8位+24-31位)[32位]+(16-31位) 段限長16-19位+0-15位,只有20位,剩下的12位怎麼填充呢? 由G位來決定!
如果 G = 0,把段描述符中的LIMIT取出來,比如 0xfffff,然後在前面補 0 至32bit,即 limit = 0x000fffff
如果 G = 1,把段描述符中的LIMIT取出來,比如 0xfffff,然後在後面補 f 至32bit, 即 LIMIT = 0xffffffff
- S(12):
- S=1 程式碼段或者資料段描述符
- S=0 系統段描述符
- TYPE域(8-11)
P位 DPL S位 TYPE
15 14 13 12 11 10 9 8
1 1/0 1/0 1/0 1/0
p位為1時段描述符才有效
DPL只能同時為1或者同時為0
S位為1時才是程式碼段或者資料段
如果段描述符有效,且DPL為3的時候,還是程式碼段或者資料段的時候 那麼12-15位(第五位)為F 00cf>f<300`0000ffff
如果段描述符有效,且DPL為0的時候,還是程式碼段或者資料段的時候 那麼12-15位(第五位)為9 00cf>9<400`0000ffff
如果段描述符有效,且DPL為0的時候,是系統段描述符 那麼12-15位(第五位)為8 00cf>8<000`0000ffff
---------------------------------------------------------------------
如果段描述符無效,P位為0,那麼這個段描述符的>第五位<一定為0,並且12-15位小於等於7
---------------------------------------------------------------------
如果S位為1 (使用者描述符-程式碼段-資料段描述符),11位為TYPE域的開頭,決定了段描述符是程式碼段描述符
還是資料段描述符,如果11位為0則代表是資料段描述符,為1則代表程式碼段描述符
所以第六位如果為資料段(為0)時,則第六位肯定小於8
00cff>3<00`0000ffff 00cff>4<00`0000ffff 00cff>5<00`0000ffff
如果是程式碼段,11位為1,則第六位大於等於8
00cff>9<00`0000ffff 00cff>b<00`0000ffff 00cff>a<00`0000ffff
----------------------------------------------------------------------
後面TYPE域3位屬性將不會一一拆解,請對照Tbale 3-1對照,下面直接示範拆解
----------------------------------------------------------------------
如果拆解段描述符,以下為示例:
----------------------------------------------------------------------------------------
00cf>f<300`0000ffff
其中第五位為F,則肯定P位為0,且DPL為11(3環),S位為也為1,肯定是一個使用者段描述符
00cff>3<00`0000ffff
第六位為3(0011),查表的
Decimal 11 10 9 8 Descriptor Type Description
2 0 0 1 1 DATA Read/Write,Accessed
結論
根據Tbale 3-1使用者段描述符屬性拆解得知,此段屬性為使用者段,DPL為3,使用者可以訪問,且是一個數據段描述符,可讀可寫,而且被訪問過
--------------------------------------------------------------------------------------------
00cf>9<B00`0000ffff
其中第五位為F,則肯定P位為0,且DPL為11(3環),S位為也為1,肯定是一個使用者段描述符
00cf9>A<00`0000ffff
第六位為A(1010),查表的
Decimal 11 10 9 8 Descriptor Type Description
A 1 0 1 0 CODE Executed/Read
結論
根據Tbale 3-1使用者段描述符屬性拆解得知,此段屬性為使用者段,DPL為3,使用者可以訪問,且是一個程式碼描述符,可讀可執行
------------------------------------------------------------------------------------
如果是資料段,描述符第六位(8-11位)中的第10位,為擴充套件屬性位
- 如果為0,則向上擴充套件
- 如果為1,則向下擴充套件
如果是程式碼段,描述符第六位(8-11位)中的第10位,為一致位(C位)
- 如果C為0,非一致程式碼段
- 如果C為1,一致程式碼段
如果S為0的時候-該段描述符為系統描述符.系統描述符有分為以下型別
- 情況一:對CS段的影響
- 情況一:對CS段的影響
- D = 0 採用16位定址方式
- 字首67 改變定址方式
67:8965 FF MOV DWORD PTR DS:[DI+FFFF],ESP //DI 16位
- 情況二:對SS段的影響
- D = 1 隱式堆疊訪問指令(如:PUSH POP CALL) 使用32位堆疊指標暫存器ESP
- D = 0 隱式堆疊訪問指令(如:PUSH POP CALL) 使用16位堆疊指標暫存器SP
- 隱式堆疊訪問(比如PUSH EAX的時候,並沒有動ESP暫存器,但是堆疊會自動變化)
- 情況三:向下拓展的資料段
- D = 1 段上限為4GB
- D = 0 段上限為64KB