段描述符屬性分析

段描述符屬性詳細解析,學習時候,請記住:這些都是CPU的概念,並非操作系統的。

段描述符屬性分析

段描述符屬性

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

S位
當 S=1 時,該描述符描述代碼段或數據段,TYPE爲不同值時,有以下含義,如圖:
段描述符屬性分析
A : 訪問位,該段是否被訪問過。每當處理器將該段選擇子置入某個段寄存器時,就將該位置1.
W : 該數據段是否可寫。
E : 擴展方向。通常來說,描述符的 [base, base + limit] 這段空間是可訪問的,其它空間不可訪問。如果 E = 1,[base, base +limit] 就變的不可訪問,相反,其它空間變的可訪問。所以 E 位,有反轉有效空間的含義。
C : C = 1 表示一致代碼段。否則C = 0 表示非一致代碼段。
R : R = 1 表示該代碼段可讀。






當 S = 0 時,該描述會描述系統段,此時 TYPE 爲不同值時,有以下含義。

TYPE    含義
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位陷阱門

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。

段權限檢查

上面提到了請求特權級(RPL),當前運行特權級(CPL),另外還有一個段描述符的特權級(DPL),三者之間的關係是:

1.數據段權限檢查

(1)段描述符屬性DPL,這是段描述符的特權級。它的含義是,如果你想訪問我這個段,你應當具備什麼樣的級別。即:要求CPL >= DPL纔有效,就是說如果我這個段只能在0環程序訪問,那麼你3環程序就不能訪問。
(2)請求特權級RPL在段選擇子中(不是段寄存器),它的含義是當前我想以 RPL 這個級別來請求你把這個段選擇子置入段寄存器。實際上 RPL 並沒有什麼用。因爲請求者任何時刻都可以讓 RPL = 0。但是如果請求者是 CPL = 0 的程序,用 RPL = 3 的級別來請求 DPL = 0的數據段,必然會失敗。即:要求RPL >= DPL纔有效,就是說如果我這個段只能被CPL=0的段選擇子訪問,那麼你RPL=3的段選擇子就不能訪問。
總結:
數據段權限檢查,本質上就是檢查能不能把段選擇子代入到段寄存器。如果代入成功,表明權限檢查通過。如果代入不成功,說明權限不夠(CPL在數值上太大了)。


2.代碼段權限檢查

只有得到段描述符的同意,才允許低權限的程序跳轉進去執行,這種段稱爲一致代碼段。(要求:CPL >= DPL)
有些代碼段描述符,絕對不允許低權限的程序跳轉進去執行,這種段稱爲非一致代碼段。(要求:CPL == DPL 並且 RPL <= DPL)
總結:
(1)對於一致代碼段:也就是共享的段
特權級別高的程序不允許訪問特權級別低的數據:核心態不允許訪問用戶態的數據
特權級別低的程序可以訪問到特權級別高的數據,但特權級別不會改變:系統調用,用戶態還是用戶態
(2)對於普通代碼段:也就是非一致代碼段
只允許同級訪問
絕對禁止不同級別的訪問:核心態不允許訪問用戶態,用戶態也不允許訪問核心態
(3)直接對代碼段進行JMP或者CALL的操作,無論目標是一直代碼段還是非一致代碼段,CPL都不會發生改變,如果要提升CPL的權限,只能通過調用門








發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章