- 對(duì)數(shù)據(jù)段特權(quán)檢查
- 對(duì)直接轉(zhuǎn)移的代碼段特權(quán)檢查
- 棧段的檢查
- 調(diào)用門的檢查
權(quán)限問(wèn)題:
- 由于CPL,DPL 無(wú)法完整表達(dá)權(quán)限的問(wèn)題.
例如用戶程序(CPL=3)通過(guò)調(diào)用門(將調(diào)用到內(nèi)核過(guò)程,從低權(quán)限到高權(quán)限)執(zhí)行,此時(shí)CPL=0,此時(shí)可以為所欲為. - 因此加入RPL.此參數(shù)由操作系統(tǒng)來(lái)保證,CPU僅使用
-
- RPL: 想以哪種權(quán)限去訪問(wèn), 操作系統(tǒng)來(lái)填寫(xiě), 一個(gè)自由的參數(shù)
-
- 描述符里的DPL=CPL=CS.RPL(16位中的低2位)
-
- DPL:訪問(wèn)此描述符的權(quán)限
對(duì)于數(shù)據(jù)段的特權(quán)檢查:
從大方向說(shuō):只要權(quán)限比數(shù)據(jù)段大 ,或者相等就OK
實(shí)際根據(jù)以下幾個(gè)步驟:
CPL:當(dāng)前CS段的RPL, RPL:請(qǐng)求這個(gè)數(shù)據(jù)段的權(quán)限, DPL: 數(shù)據(jù)段的權(quán)限
-
- 根據(jù)CPL, RPL , DPL 這3個(gè)來(lái)檢查
-
- CPL <= DPL && RPL <= DPL
假設(shè)有 數(shù)據(jù)段 DPL= 2:
代碼段CPL=0 | 代碼段CPL=1 | 代碼段CPL=2 | 代碼段CPL=3 |
---|
RPL=0 可訪問(wèn) | RPL=1可訪問(wèn) | RPL=2可訪問(wèn) | RPL=3 不可訪問(wèn) |
RPL=1或2 可訪問(wèn) | RPL=0 可訪問(wèn) | RPL=1 可訪問(wèn) | RPL=2 不可訪問(wèn) |
RPL=3 不可訪問(wèn) | RPL=2可訪問(wèn) | RPL=0可訪問(wèn) | RPL=1不可訪問(wèn) |
- 可以看到CPL=0的代碼段,即使有最高權(quán)限,但如果RPL=3,也無(wú)法訪問(wèn)
- 至于CPL=3的代碼段,無(wú)論如何都無(wú)法訪問(wèn),畢竟CPL>DPL
對(duì)跳轉(zhuǎn)或調(diào)用的代碼段檢查
這里特指 call far , jmp far
- jmp , call ,ret 這些都是段內(nèi)的, 不需要重新加載cs , 因此不做檢查
-
- 調(diào)用過(guò)程的CPL,RPL
-
- 轉(zhuǎn)移到此處的目標(biāo)描述符的DPL,C(是否是一致性代碼段)
- 綜上CPL,RPL,DPL,C 4項(xiàng)參與檢查
- 又根據(jù)C 進(jìn)行分別檢查 if ( 1==C ){ 一致性代碼段檢查} else { 非一致性代碼段檢查}
如果C=0, 非一致性代碼段的檢查:
- CPL == DPL , 必須是相同特權(quán)級(jí), 否則產(chǎn)生異常
- 由于只能是平級(jí)跳轉(zhuǎn),因此轉(zhuǎn)移前后CPL不變
- 對(duì)于RPL: RPL<=CPL即可,畢竟RPL是一種希望用哪種方式(權(quán)限)去訪問(wèn),RPL并不會(huì)影響CPL,RPL只用于檢查
假設(shè)非一致性代碼段的描述符:DPL=2,C=0
非一致性代碼段描述符 | 代碼段CPL=1 | 代碼段CPL=2 | 代碼段CPL=3 |
---|
現(xiàn)有非一致性代碼段的描述符:DPL=2,C=0 | CPL不一致,RPL=0~3都不可轉(zhuǎn)移 | RPL=0~2都可以轉(zhuǎn)移,RPL=3則無(wú)法轉(zhuǎn)移 | CPL不一致,RPL=0~3都無(wú)法轉(zhuǎn)移 |
- | - | 成功轉(zhuǎn)移后,CPL不變,RPL只用作檢查,而非賦值 | - |
C=1, 一致性代碼段檢查(依從性)
- RPL不參與檢查
- 滿足: CPL>=DPL(一致性代碼段), 也就是當(dāng)前特權(quán)比目標(biāo)代碼段低或相等即可
- 一旦轉(zhuǎn)移后, CPL不改變,依舊保持之前調(diào)用者的
假設(shè)一致性代碼段的描述符:DPL=1,C=1
一致性代碼段描述符 | 代碼段CPL=1 | 代碼段CPL=2 | 代碼段CPL=3 | 代碼段CPL=0 |
---|
一致性代碼段的描述符:DPL=1,C=1 | 可以訪問(wèn) | 可以訪問(wèn) | 可以訪問(wèn) | 不可以訪問(wèn) |
- RPL不參與檢查,轉(zhuǎn)移成功后CPL不改變
綜上
- 對(duì)于代碼段, 主要還是看CPL
- 對(duì)于數(shù)據(jù)段,需要RPL來(lái)輔助檢查
棧段檢查
調(diào)用門檢查
- 通過(guò)調(diào)用門可以執(zhí)行一個(gè)高于本CPL的過(guò)程
- 調(diào)用門指向了某個(gè)代碼段內(nèi)的某一個(gè)過(guò)程
- 調(diào)用門本身也有DPL,想要使用調(diào)用門,調(diào)用者的CPL<=調(diào)用門DPL,也就需要達(dá)到使用調(diào)用門的權(quán)限
- 訪問(wèn)調(diào)用門可以使用 jmp far , call far
- 一旦訪問(wèn)了調(diào)用門,檢查順利后,根據(jù)調(diào)用門描述符內(nèi)的 段選擇子獲取段描述符的基址 + 調(diào)用門內(nèi)的偏移地址,就這個(gè)過(guò)程的線性地址
- 調(diào)用門就是一個(gè)描述符,格式:
31 ~ 16 | 15 | 14 ~ 13 | 12 | 11 ~ 8 | 7 ~ 5 | 4 ~ 0 |
---|
段內(nèi)偏移高16位 | P | DPL | 0 | TYPE(1100) | 000 | 參數(shù)個(gè)數(shù) |
31 ~ 16 | 15 ~ 0 |
---|
段選擇子 | 段內(nèi)偏移低16位 |
- 調(diào)用門需要4項(xiàng)檢查:
- 當(dāng)前調(diào)用者的CPL
- 調(diào)用門選擇子RPL (操作系統(tǒng) 自己維護(hù))
- 調(diào)用門描述符DPL
- 目標(biāo)代碼段描述符的DPL
- 檢查2步:
-
- 首先要滿足 本身能夠訪問(wèn)調(diào)用門:CPL <= 門DPL, RPL <= 門DPL
-
- 下表格:
指令 | 一致性代碼段 | 非一致性代碼段 |
---|
call far | 代碼段描述符DPL<=CPL | 代碼段描述符DPL<=CPL |
jmp far | 代碼段描述符DPL<=CPL | 代碼段描述符DPL=CPL |
call far指令,棧切換 | CPl不發(fā)生變化,棧不切換 | CPL變成目標(biāo)代碼段的DPL,棧需要切換 |
jmp far 指令,棧切換 | CPL不變,棧不切換 | 由于DPL=CPL,棧不切換 |
- 再一次的強(qiáng)調(diào),權(quán)限無(wú)法從高到低
- 只有CPL變了,棧才會(huì)變,因此上面只有當(dāng)call指令調(diào)用 非一致性代碼段的時(shí)候, 才會(huì)切換棧, 除非CPL=DPL(例如CPL=0,目標(biāo)代碼段描述符的DPL=0)
- 綜上:
- 對(duì)于一致性代碼段: CPL>=目標(biāo)代碼段DPL, 不論JMP,CALL, 轉(zhuǎn)移后CPL不變,棧不變
- 對(duì)于非一致性代碼段:
-
- CALL指令要求: CPL >= 目標(biāo)代碼段DPL , CPL變成目標(biāo)代碼段DPL, 切換棧(除非CPL=DPL,那么棧不變)
-
- JMP 指令: CPL = 目標(biāo)代碼段DPL , CPL不變,棧不變
- 看上去內(nèi)容有點(diǎn)多,需要到處判斷,一會(huì)門檢查,一會(huì)代碼段DPL檢查,還要考慮棧切換的問(wèn)題
- 實(shí)際沒(méi)那么麻煩,也就2條需要注意的
-
- 一個(gè)是有權(quán)限訪問(wèn)門 ,也就是本身權(quán)限至少要與門相等 數(shù)值上: CPL <= 門DPL, RPL <=門DPL
-
- 調(diào)用者代碼段的權(quán)限,要低于代碼段或相等,也就是低權(quán)限到高權(quán)限,那么數(shù)值上: CPL>= 目標(biāo)代碼段DPL
- 至于jmp 和 call 的區(qū)別不用記, 讓CPU產(chǎn)生保護(hù)性異常(GP)告訴我們即可,一旦產(chǎn)生異常說(shuō)明此處jmp 指令有問(wèn)題了( CPL != DPL)
- 對(duì)于棧的問(wèn)題,一句話就解決,CPL一變, 棧跟著變 ; CPL不變,棧也不變
調(diào)用門的首次檢查例子:
門描述符 | 代碼段A | 代碼段B | 代碼段C | 代碼段D | - |
---|
門DPL=3 | CPL=3 | CPL=2 | CPL=1 | CPL=0 | 代碼段A,B,C,D任意+RPL=0~3都可以訪問(wèn) |
門DPL=2 | CPL=3,RPL=0~3都無(wú)法訪問(wèn) | CPL=2,RPL=0~2可以訪問(wèn),RPL=3無(wú)法訪問(wèn) | CPL=1,RPL=0~2可以訪問(wèn),RPL=3無(wú)法訪問(wèn) | CPL=0,RPL=0~2可以訪問(wèn),RPL=3無(wú)法訪問(wèn) | A的CPL權(quán)限不足以訪問(wèn)門DPL;B,C,D的CPL全部滿足,同時(shí):RPL<=門DPL |