天天看點

4-段描述符屬性分析

上一篇隻是簡單的給出了段描述符的結構,但是并未詳細講解各個屬性的含義。本篇講解段描述符的 P/S/DB位。

段描述符結構

|   7    |     6       |     5     |   4    |   3    |   2    |   1    |   0    |  位元組
|76543210|7 6 5 4 3210 |7 65 4 3210|76543210|76543210|76543210|76543210|76543210|  比特
|--------|-|-|-|-|---- |-|--|-|----|--------|--------|--------|--------|--------|  占位
|  BASE  |G|D|0|A|LIMIT|P|D |S|TYPE|<------- BASE 23-0 ------>|<-- LIMIT 15-0 ->|  含義
|  31-24 | |/| |V|19-16| |P |
           |B| |L|     | |L |      

P 位

  • P=1 : 該描述符有效
  • P=0 : 該描述符無效

S 位

  • S=1:該描述符描述代碼段或資料段

當 S = 1 時,TYPE為不同值時,有以下含義。

4-段描述符屬性分析

圖 1 代碼段或資料段

  • A : 通路位,該段是否被通路過。每當處理器将該段選擇子置入某個段寄存器時,就将該位置1.
  • W : 該資料段是否可寫。
  • E : 擴充方向。通常來說,描述符的 [base, base + limit] 這段空間是可通路的,其它空間不可通路。如果 E = 1,[base, base +limit] 就變的不可通路,相反,其它空間變的可通路。是以 E 位,有反轉有效空間的含義。
  • C : C = 1 表示一緻代碼段。後面的文章會講解。
  • R : R = 1 表示該代碼段可讀。代碼段是不可寫的。
  • S=0:該描述會描述系統段

當 S = 0 時,表示系統段,此時 TYPE 為不同值時,有以下含義。

TYPE 含義
保留
1 16位TSS段(可用)
2 LDT
3 16位TSS段(忙)
4 16位調用門
5 任務門
6 16位中斷門
7 16位陷阱門
8 保留
9 32位TSS段(可用)
a 保留
b 32位TSS段(忙)
c 32位調用門
d 保留
e 32位中斷門
f 32位陷阱門

這裡,你還不需要知道各種系統段到底是什麼意思,後續文章會逐漸拉開序幕。

D/B 位

  • 對于代碼段的影響

D/B 位會影響指令操作數大小,為 0 時操作數大小為 16位,為 1 時操作大小為 32 位。什麼意思呢?

比如說,執行 push 指令時,16 位操作數下,使用的堆棧指針寄存器是 SP,隻有 16 位,PUSH一次 SP 的值減 2. 而 32 位操作數下,使用的堆棧指針寄存器是 ESP,PUSH 一次 ESP 的值減 4.

  • 對于資料段的影響

該位為 0 時,段大小最大為 64 KB,該位為 1 時,段大小最大為 4GB。

實驗

為了能熟練分析段描述符,必要的練習是必然少不了的。有些同學可能對此不屑,這種東西隻要查查手冊,對着看一下就行了。對此我也表示沉默,每個人學習方法和套路也是有所不同的,可以了解。

原始資料

|--位址--|------------16進制值----------------|
8003f000  00000000`00000000 00cf9b00`0000ffff
8003f010  00cf9300`0000ffff 00cffb00`0000ffff
8003f020  00cff300`0000ffff 80008b04`200020ab
8003f030  ffc093df`f0000001 0040f300`00000fff
8003f040  0000f200`0400ffff 00000000`00000000
8003f050  80008954`a1000068 80008954`a1680068
8003f060  00009302`2f30ffff 0000920b`80003fff
8003f070  ff0092ff`700003ff 80009a40`0000ffff
8003f080  80009240`0000ffff 00009200`00000000
8003f090  00000000`00000000 00000000`00000000
8003f0a0  8200891b`22e00068 00000000`00000000
8003f0b0  00000000`00000000 00000000`00000000
8003f0c0  00000000`00000000 00000000`00000000
8003f0d0  00000000`00000000 00000000`00000000
8003f0e0  f8009f71`a000ffff 00009200`0000ffff
8003f0f0  8000984f`b2e403b7 00009200`0000ffff
8003f100  f8409337`9400ffff f8409337`9400ffff
8003f110  f8409337`9400ffff 00000000`8003f120      

找出所有資料段,并分析該段屬性:隻讀、已通路、可讀可寫、拓展方向

分析:資料段特征,第5位十六數字非9即f,第6位十六進制數字 0EWA, E表示擴充方向,W表示可寫,A表示已通路

第6位常見數字分析:
0: 0000: 向上擴充,隻讀,未通路
1: 0001: 向上擴充,隻讀,已通路
2: 0010: 向上擴充,讀寫,未通路
3: 0011: 向上擴充,讀寫,已通路

資料段描述符:
        .------第5位
        |.-----第6位
        ||
 1) 00cf9300`0000ffff 向上擴充,讀寫,已通路
 2) 00cff300`0000ffff 向上擴充,讀寫,已通路
 3) ffc093df`f0000001 向上擴充,讀寫,已通路
 4) 0040f300`00000fff 向上擴充,讀寫,已通路
 5) 0000f200`0400ffff 向上擴充,讀寫,未通路
 6) 00009302`2f40ffff 向上擴充,讀寫,已通路
 7) 0000920b`80003fff 向上擴充,讀寫,未通路
 8) ff0092ff`700003ff 向上擴充,讀寫,未通路
 9) 80009240`0000ffff 向上擴充,讀寫,未通路
10) 00009200`00000000 向上擴充,讀寫,未通路
11) 00009200`0000ffff 向上擴充,讀寫,未通路
12) 00009200`0000ffff 向上擴充,讀寫,未通路
13) f8409337`9400ffff 向上擴充,讀寫,已通路
14) f8409337`9400ffff 向上擴充,讀寫,已通路
15) f8409337`9400ffff      

找出所有代碼段,并分析該段屬性:隻執行、可讀可執行、 已通路、一緻代碼

第6位常見數字分析
8: 1000: 非一緻代碼段,隻執行,未通路
9:1001:非一緻代碼段,隻執行,已通路
a: 1010: 非一緻代碼段,可執行可讀,未通路
b: 1011: 非一緻代碼段,可執行可讀,已通路

代碼段描述符
       .------第5位
       |.-----第6位
       ||
1) 00cf9b00`0000ffff 非一緻代碼段,可執行可讀,已通路
2) 00cffb00`0000ffff 非一緻代碼段,可執行可讀,已通路
3) 80009a40`0000ffff 非一緻代碼段,可執行可讀,未通路
4) f7009f66`d000ffff 一緻代碼段,可執行可讀,已通路
5) 8000984f`b6b003b7 非一緻代碼段,隻執行,未通路      

找出所有系統段,并分析屬性.

0: 保留
1: 16位TSS段(可用)
2: LDT
3: 16位TSS段(忙)
4: 16位調用門
5: 任務門
6: 16位中斷門
7: 16位陷阱門
8: 保留
9: 32位TSS段(可用)
a: 保留
b: 32位TSS段(忙)
c: 32位調用門
d: 保留
e: 32位中斷門
f: 32位陷阱門

系統段描述符:
       .------第5位
       |.-----第6位
       ||
1) 80008b04`200020ab 32位TSS段(忙)
2) 80008954`b1000068 32位TSS段(可用)
3) 80008954`b1680068 32位TSS段(可用)
4) 8600895e`a3300068 32位TSS段(可用)