一个操作系统的实现:关于CPL、RPL、DPL
保護(hù)模式中最重要的一個(gè)思想就是通過分級(jí)把代碼隔離了起來,不同的代碼在不同的級(jí)別 ,使大多數(shù)情況下都只和同級(jí)代碼發(fā)生關(guān)系。 Intel
的80286以上的cpu可以識(shí)別4個(gè)特權(quán)級(jí)(或特權(quán)層)
,0級(jí)到3級(jí)。數(shù)值越大特權(quán)越小。一般用把系統(tǒng)內(nèi)核放在0級(jí),系統(tǒng)的其他服務(wù)程序位于1、2級(jí),3級(jí)則是應(yīng)用軟件。一般情況下代碼都在自己的級(jí)別下做自己
的工作,同一級(jí)別之間可以相互訪問,而一般是不允許不同級(jí)別的代碼間隨意訪問的。但有時(shí)候不同級(jí)別的程序之間一定要訪問,比如系統(tǒng)的接口函數(shù)等,必須能夠
使得應(yīng)用程序能夠隨意調(diào)用。于是Intel將代碼分為:
1.非一致碼:受到隔離的代碼,只能在同一級(jí)別間相互訪問
2.一致碼:不受到隔離的就是,允許被同等級(jí)或低等級(jí)代碼調(diào)用
至于這部分我們下回再詳細(xì)說,這里主要搞清楚RPL、DPL、CPL之間的關(guān)系。
Intel設(shè)置DPL、RPL、CPL以實(shí)現(xiàn)分級(jí)和權(quán)限檢查。
DPL:描述符特權(quán)(Descriptor Privilege Level)
存
儲(chǔ)在描述符中的權(quán)限位,用于描述代碼的所屬的特權(quán)等級(jí),也就是代碼本身真正的特權(quán)級(jí)。一個(gè)程序可以使用多個(gè)段(Data,Code,Stack)也可以只
用一個(gè)code段等。正常的情況下,當(dāng)程序的環(huán)境建立好后,段描述符都不需要改變——當(dāng)然DPL也不需要改變,因此每個(gè)段的DPL值是固定。
RPL:請(qǐng)求特權(quán)級(jí)RPL(Request Privilege Level)
RPL保存在選擇子的最低兩位。 RPL
說明的是進(jìn)程對(duì)段訪問的請(qǐng)求權(quán)限,意思是當(dāng)前進(jìn)程想要的請(qǐng)求權(quán)限。
RPL
的
值
由程序員自己來自由的設(shè)置,并不一定RPL>=CPL,但是當(dāng)RPL<CPL時(shí),實(shí)際起作用的就是CPL了,因?yàn)樵L問時(shí)的特權(quán)檢查是判
斷:EPL=max(RPL,CPL)<=DPL是否成立,所以RPL可以看成是每次訪問時(shí)的附加限制,RPL=0時(shí)附加限制最小,RPL=3時(shí)附
加限制最大。所以你不要想通過來隨便設(shè)置一個(gè)rpl來訪問一個(gè)比cpl更內(nèi)層的段。
因?yàn)槟悴豢赡艿玫奖茸约焊叩臋?quán)限,你申請(qǐng)的權(quán)限一定要比你實(shí)際權(quán)限低才能通過CPU的審查,才能對(duì)你放行。所以實(shí)際上RPL的作用是程序員可以把自己的程序降級(jí)運(yùn)行——有些時(shí)候?yàn)榱烁玫陌踩?程序可以在適當(dāng)?shù)臅r(shí)機(jī)把自身降低權(quán)限(RPL設(shè)成更大的值)。
網(wǎng)上許多人都說在問rpl的作用,我也很暈。Intel的手冊(cè)中對(duì)RPL的作用只是這樣做的簡(jiǎn)短解釋的:
The
RPL can be used to insure that privileged code does not access a
segment on behalf of an application program unless the program itself
has access privileges for that segment.
后來找到了一些資料對(duì)這段話進(jìn)行了擴(kuò)充和舉例,我才明白一些:
對(duì)于特權(quán)級(jí)高的進(jìn)程RPL是作用是防止自己不小心訪問到一些資料段。比方說,如果進(jìn)程A的CPL=0,它知道它的委托進(jìn)程B的DPL=3,也知道數(shù)據(jù)段C的DPL=2,而這數(shù)據(jù)段是不能讓CPL>2的進(jìn)程訪問的。
那
么如果你是進(jìn)程A的程序員根本不需要RPL的幫助,也不會(huì)試圖讓進(jìn)程A訪問數(shù)據(jù)段C的數(shù)據(jù),
因?yàn)檫@樣做只會(huì)浪費(fèi)時(shí)間。當(dāng)然如果你一定要訪問數(shù)據(jù)段C的數(shù)據(jù)然后把數(shù)據(jù)傳給委托進(jìn)程B,這就是你的選擇,你真的可以這樣做,但后果自負(fù)。只是有時(shí)候要訪
問的數(shù)據(jù)段我們不知道它的DPL是怎么,也不知道能不能讓進(jìn)程B訪問,其中的一個(gè)解決方法就是把委托進(jìn)程B的DPL以RPL的方法告訴數(shù)據(jù)段C讓它決定接
受或不接受。(我想應(yīng)該是通過程序把B的DPL裝入到A的選擇子中,然后再由A去訪問數(shù)據(jù)段C)
CPL:當(dāng)前任務(wù)特權(quán)(Current Privilege Level)
表
示當(dāng)前正在執(zhí)行的代碼所處的特權(quán)級(jí)。CPL保存在CS中的最低兩位,是針對(duì)CS而言的。當(dāng)選擇子成功裝入CS寄存器后,相應(yīng)的選擇子中的RPL就變成了
CPL。因?yàn)樗奈恢米兞?,已?jīng)被裝入到CS寄存器中了,所表達(dá)的意思也發(fā)生了變——原來的要求等級(jí)已經(jīng)得到了滿足,就是當(dāng)前自己的等級(jí)。
選擇子可以有許多個(gè),因此RPL也就有許多個(gè)。而CPL就不同了,正在執(zhí)行的代碼在某一時(shí)刻就只有這個(gè)值唯一的代表程序的CPL.
另外特別要求CS與SS的特權(quán)級(jí)必須保持一致。對(duì)于裝入DS、ES、FS、GS的選擇子INTEL沒有給它們起什么特殊的名稱,我也不知道應(yīng)該叫它們什么,也許可以仍然稱它為RPL。
應(yīng)用RPL實(shí)現(xiàn)數(shù)據(jù)段的特權(quán)級(jí)保護(hù)的實(shí)例
計(jì)
算機(jī)軟件一般由操作系統(tǒng)程序和應(yīng)用程序組成。為了組建高可靠性的軟件系統(tǒng),要求操作系統(tǒng)的數(shù)據(jù)不允許被應(yīng)用程序改變,否則,應(yīng)用程序會(huì)影響系統(tǒng)的安全運(yùn)
行,嚴(yán)重時(shí)導(dǎo)致系統(tǒng)崩潰瓦解。一個(gè)由操作系統(tǒng)程序與應(yīng)用程序組成的軟件如圖1所示。在操作系統(tǒng)程序中有一MOVE過程把一個(gè)數(shù)據(jù)段中的數(shù)據(jù)塊寫到另一個(gè)數(shù)
據(jù)段中,MOVE過程是通過參數(shù)傳入被調(diào)用的,即 MOVE(destination,source,count)。其中:source
源數(shù)據(jù)塊的邏輯地址;destination 目標(biāo)數(shù)據(jù)塊的邏輯地址;count 傳送的字節(jié)數(shù)
數(shù)據(jù)塊的邏輯地址由數(shù)據(jù)段選擇字對(duì)應(yīng)的數(shù)據(jù)段描述符和數(shù)據(jù)塊偏移量所描述。
MOVE過程是操作系統(tǒng)的程序,它可以合法地被操作系統(tǒng)中的其它過程調(diào)用,完成操作系統(tǒng)數(shù)據(jù)段中的數(shù)據(jù)塊移動(dòng)和操作系統(tǒng)數(shù)據(jù)段與應(yīng)用程序數(shù)據(jù)段中的數(shù)據(jù)塊移動(dòng)。但是,若MOVE過程被應(yīng)用程序調(diào)用,操作系統(tǒng)數(shù)據(jù)段的數(shù)據(jù)有可能失去保護(hù)作用。設(shè)應(yīng)用程序的典型調(diào)用情形為:
①M(fèi)OVE(數(shù)據(jù)塊A,數(shù)據(jù)塊1,count)
②MOVE(數(shù)據(jù)塊B,數(shù)據(jù)塊A,count)
③MOVE(數(shù)據(jù)塊2,數(shù)據(jù)塊1,count)
④MOVE(數(shù)據(jù)塊1,數(shù)據(jù)塊A,count)
情形①:應(yīng)用程序通過MOVE過程得到操作系統(tǒng)數(shù)據(jù)塊的信息;
情形②:應(yīng)用程序利用MOVE過程完成應(yīng)用程序數(shù)據(jù)塊之間的數(shù)據(jù)移動(dòng);
①、②這二種情形是合法的要求。
情形③:應(yīng)用程序控制了操作系統(tǒng)的工作,沒有按操作系統(tǒng)的工作步驟,強(qiáng)行改變了數(shù)據(jù)塊2的內(nèi)容;
情形④:應(yīng)用程序?qū)?yīng)用程序數(shù)據(jù)塊A的內(nèi)容移動(dòng)到操作系統(tǒng)數(shù)據(jù)塊1中,自行改變了數(shù)據(jù)塊1的內(nèi)容;
在③、④這二種情形使操作系統(tǒng)的數(shù)據(jù)得不到核心保護(hù),操作系統(tǒng)的數(shù)據(jù)受到了應(yīng)用程序的侵犯。
針對(duì)上述的侵權(quán)示例,如何防止應(yīng)用程序改變操作系統(tǒng)的數(shù)據(jù),即情形①和②;并且,應(yīng)用程序能通過調(diào)用操作系統(tǒng)程序中的MOVE過程合法地使用,即情形③和④;這是操作系統(tǒng)軟件設(shè)計(jì)中必須考慮的問題。
設(shè)調(diào)用MOVE過程的程序段Proc為:
……
LDS EAX,source ;DS:EAX=source源數(shù)據(jù)塊的邏輯地址
PUSH DS ;壓入source源數(shù)據(jù)塊的選擇字
PUSH EAX ;壓入source源數(shù)據(jù)塊的偏移量
LDS EAX,destination ;DS:EAX=destination目標(biāo)數(shù)據(jù)塊的邏輯地址
PUSH DS ;壓入destination目標(biāo)數(shù)據(jù)塊的選擇字
PUSH EAX ;壓入destination目標(biāo)數(shù)據(jù)塊的偏移量
MOV ECX,count ;ECX=傳送的字節(jié)數(shù)count
PUSH ECX ;壓入傳送的字節(jié)數(shù)count
CALL MOVE ;調(diào)用MOVE過程,MOVE由調(diào)用門描述
……
如果Proc在操作系統(tǒng)程序中,無論source源數(shù)據(jù)塊和destination目標(biāo)數(shù)據(jù)塊屬于操作系統(tǒng)或應(yīng)用程序,都能合法的運(yùn)作。
如果Proc在應(yīng)用程序中,有可能產(chǎn)生情形③和④。例如,應(yīng)用程序傳入的目標(biāo)數(shù)據(jù)塊選擇字的RPL=0,就意味著應(yīng)用程序要對(duì)操作系統(tǒng)的數(shù)據(jù)段進(jìn)行非法寫入。為此,必須在MOVE過程中加以判斷,避免情形③和④的產(chǎn)生。
在
MOVE過程中采用的處理方法是:目標(biāo)數(shù)據(jù)塊選擇子的RPL應(yīng)以主調(diào)程序的CPL為準(zhǔn)。即采用ARPL指令改目標(biāo)數(shù)據(jù)塊選擇子的RPL為主調(diào)程序的
CPL(關(guān)于ARPL指令的使用說明見最后)。依據(jù)應(yīng)用程序調(diào)用MOVE過程的堆棧,如圖2所示,在MOVE過程始部(開始)加入的指令為:
MOV AX,SS:[ESP+4] ;AX=CS主調(diào)程序的代碼段選擇字
;其RPL字段為主調(diào)程序的CPL
ARPL SS:[ESP+10],AX ;改目標(biāo)數(shù)據(jù)塊選擇子的RPL為主調(diào)程序的CPL
MOV ES,SS:[ESP+10] ;ES=目標(biāo)數(shù)據(jù)塊選擇子(其RPL字段為主調(diào)程序 ;的CPL)
……
進(jìn)
行了上述處理以后,如果應(yīng)用程序傳入的目標(biāo)數(shù)據(jù)塊選擇字的RPL=0,ARPL把它修改為RPL=3,再傳送到ES段寄存器中,顯然不能滿足選擇字的裝載
要求,即MAX(CPL,RPL)≤DPL,其中,MOVE過程的CPL=0;目標(biāo)數(shù)據(jù)塊選擇字對(duì)應(yīng)的數(shù)據(jù)段描述符中的DPL=0。CPU內(nèi)部立即產(chǎn)生通
用保護(hù)異常中斷進(jìn)行處理。處理的結(jié)果通常為:終止當(dāng)前的MOVE過程操作,返回應(yīng)用程序;或終止應(yīng)用程序的運(yùn)行,返回操作系統(tǒng)。從而達(dá)到了保護(hù)目的。而情
形①、②,應(yīng)用程序完全可以合法實(shí)現(xiàn)。
[關(guān)于ARPL指令的使用說明]
調(diào)整申請(qǐng)?zhí)貦?quán)級(jí)指令: ARPL OPRD1,OPRD2
其
中,操作數(shù)OPRD1可以是16位通用寄存器或存儲(chǔ)單元,操作數(shù)OPRD2是16位通用寄存器。該指令把操作數(shù)OPRD1和OPRD2視為兩個(gè)選擇子,用
OPRD2的RPL去檢查OPRD1的RPL。(選擇子OPRD1和OPRD2的RPL分別由它們的最低2個(gè)位規(guī)定。)
如
果OPRD1的RPL值小于OPRD2的RPL值(OPRD1的特權(quán)級(jí)高于OPRD2),那么零標(biāo)志ZF被置1,并把OPRD2的RPL值賦予OPRD1
的RPL(使兩個(gè)操作數(shù)的最低2位相等);否則,零標(biāo)志ZF被清0。OPRD1和OPRD2都可為空選擇子。該指令只影響ZF標(biāo)志。
總結(jié)
以上是生活随笔為你收集整理的一个操作系统的实现:关于CPL、RPL、DPL的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 论文尾注后无法插入分节符
- 下一篇: 负对数似然(negative log-l