把書上的描述符表格弄了一下供大家參考
byte7 |
byte6 |
byte5 |
byte4 |
byte3 |
byte2 |
byte1 |
byte0 |
|
Base (24-31) |
|
(16-19) |
|
Segment base address (0-23) |
Segment limit 1 (0-15) |
|||
15 |
14 |
13 |
12 |
11 |
10 |
9 |
8 |
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
0xf |
0xe |
0xd |
0xc |
0xb |
0xa |
0x9 |
0x8 |
0x7 |
0x6 |
0x5 |
0x4 |
0x3 |
0x2 |
0x1 |
0x0 |
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
G |
D/B |
0 |
AVL |
LIMIT2(16-19) |
P |
DPL |
S |
TYPE |
|||||||
第6位元組 |
第5位元組 |
15 |
14 |
13 |
12 |
11 |
10 |
9
|
8 |
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
0xf |
0xe |
0xd |
0xc |
0xb |
0xa |
0x9 |
0x8 |
0x7 |
0x6 |
0x5 |
0x4 |
0x3 |
0x2 |
0x1 |
0x0 |
描述符索引 |
TI |
RPL |
描述符型別 |
||
Type |
資料段和程式碼段描述符 |
系統段和門描述符 |
0 |
只讀 |
未定義 |
1 |
只讀、已訪問 |
可用286TSS |
2 |
讀、寫 |
LDT |
3 |
讀、寫、已訪問 |
忙的286TSS |
4 |
只讀、向下擴充套件 |
286呼叫門 |
5 |
只讀、向下擴充套件、已訪問 |
任務門 |
6 |
讀、寫、向下擴充套件 |
286中斷門 |
7 |
讀、寫、向下擴充套件、已訪問 |
286陷阱門 |
8 |
只執行 |
未定義 |
9 |
只執行、已訪問 |
可用386TSS |
a |
執行、讀 |
未定義 |
b |
執行、讀、已訪問 |
忙的386TSS |
c |
只執行、一致程式碼段 |
386呼叫門 |
d |
只執行、一致程式碼段、已訪問 |
未定義 |
e |
執行、讀、一致程式碼段 |
386中斷門 |
f |
執行、讀、一致程式碼段、已訪問 |
386陷阱門 |
部分術語中英文對照表 |
|
英文 |
中文 |
Descriptor |
描述符 |
Privilege |
特權級 |
Accessed |
已訪問 |
Conforming code segment |
一致程式碼段 |
Expand-down |
向下擴充套件 |
Granularity |
粒度位 |
Call Gate |
呼叫門 |
Interrupt Gate |
中斷門 |
Trap Gate |
陷阱門 |
Implicit |
隱式的 |
關於一致程式碼段的解釋:
當轉移的目標是特權級更高的一致程式碼段,當前的特權級會被延續下去,當轉移的目標是特權級更高的非一致程式碼段,會引起通用保護異常(或稱為一般保護異常、常規保護錯誤),除非使用呼叫門或任務門。如果系統程式碼不訪問受保護的資源和某些型別的異常處理(比如,除法錯誤或溢位錯誤),它可以被放在一隻程式碼段中。為避免低特權級的程式訪問被保護起來的系統程式碼則應放在非一致程式碼段中。
要注意的是,如果目的碼的特權級較低的話,無論它是不是一致程式碼段,都不能通過call或者jmp轉移進去,嘗試這樣的轉移會導致通用保護異常。
所有的資料段都是非一致的,這意味著不可能低特權級的程式碼訪問到。然而,與程式碼段不同的是,資料段可以被更高特權級的程式碼訪問到,而不需要特定的門。
一致與非一致 |
||||
特權級變化 對一致非一致的影響 |
特權級從低到高 |
特權級從高到低 |
相同特權級 |
適用於何種程式碼 |
一致程式碼段 |
是 |
否 |
是 |
不訪問受保護的資源和某些型別的異常處理的系統程式碼 |
非一致程式碼段 |
否 |
否 |
是 |
避免低特權級的程式訪問被保護起來的系統程式碼 |
資料段 (總是非一致) |
否 |
是 |
是 |
|