1. 程式人生 > >保護模式-段描述符屬性

保護模式-段描述符屬性

  • 段暫存器位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,然後在前面補 032bit,即 limit = 0x000fffff
如果 G = 1,把段描述符中的LIMIT取出來,比如 0xfffff,然後在後面補 f 至32bit, 即 LIMIT = 0xffffffff
  • S(12):
    • S=1 程式碼段或者資料段描述符
    • S=0 系統段描述符
  • TYPE域(8-11) TYPE域
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的時候-該段描述符為系統描述符.系統描述符有分為以下型別 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

DB位屬性