CPL DPL RPL的区别 一致性代码段和非一致性代码段
1.特權(quán)級(jí)
? ? ? ?首先,了解以下操作系統(tǒng)的特權(quán)級(jí)
? ? 1)CPL是存寄存器如CS中,當(dāng)前特權(quán)級(jí)。只有0和3兩個(gè)值,分別表示用戶態(tài)和內(nèi)核態(tài)。
? ? 2)RPL是代碼中根據(jù)不同段跳轉(zhuǎn)而確定,以動(dòng)態(tài)刷新CS里的CPL,在代碼段選擇符中。而且RPL對(duì)每個(gè)段來(lái)說(shuō)不是固定的,兩次訪問(wèn)同一段時(shí)的RPL可以不同。
? ? 3)DPL是在GDT/LDT描述符表中,靜態(tài)的。
? ? RPL是用來(lái)做什么的?
? ? Intel手冊(cè)上的解釋為:TheRPL
can be used to insure that privileged code does not access asegment on behalf of an application program unless the program itselfhas access privileges for that segment.(RPL能夠用來(lái)確保具有特權(quán)級(jí)的代碼不會(huì)代表另一個(gè)應(yīng)用程序去訪問(wèn)一個(gè)段,除非那個(gè)應(yīng)用程序具有訪問(wèn)那個(gè)段的權(quán)限.)
? ? 比方說(shuō):A進(jìn)程的DPL為0,C進(jìn)程的DPL為1,現(xiàn)在有一個(gè)B進(jìn)程他的DPL為2,這B進(jìn)程想委托A進(jìn)程去訪問(wèn)C的數(shù)據(jù),如果沒(méi)有RPL的話這樣的委托訪問(wèn)是可以成功的,但這樣是非常不安全的(實(shí)際上B沒(méi)有訪問(wèn)C的權(quán)限,但是A有這個(gè)權(quán)限)。有了RPL以后A進(jìn)程在訪問(wèn)C的時(shí)候還要受到RPL的約束,此時(shí)可以將訪問(wèn)C的選擇子的RPL設(shè)為B的DPL,這樣A的訪問(wèn)權(quán)限就相當(dāng)為EPL=max(RPL,DPL)=2,這樣他就無(wú)法代表B去越權(quán)訪問(wèn)C了。RPL相當(dāng)于附加的一個(gè)權(quán)限控制,只有當(dāng)RPL>DPL的時(shí)候,才起到實(shí)際的限制作用。
簡(jiǎn)單的說(shuō)就是這樣:B需要委托A去到C那里辦理某件事情,但是A的權(quán)利太大,所以需要附加委托人的權(quán)利。用一個(gè)不恰當(dāng)?shù)谋扔?#xff0c;你爺爺是皇帝,你爸爸是太子,你是太子的兒子,你爺爺還有很多孫子;其中太子的請(qǐng)求,如果不考慮其他因素,皇帝都會(huì)答應(yīng);你要去對(duì)皇帝遞交某個(gè)請(qǐng)求,來(lái)請(qǐng)你爸爸傳遞,你爺爺看見(jiàn)是你爸爸,還要核對(duì)你爸爸是幫誰(shuí)傳遞的請(qǐng)求,如果是幫你,你皇帝爺爺就批準(zhǔn)了,如果你爸爸是遞交的外人的請(qǐng)求,你爺爺未必會(huì)批準(zhǔn)。
2.段間的轉(zhuǎn)移和跳轉(zhuǎn)
程序是通過(guò)選擇子/門(mén)調(diào)用等等來(lái)在段之間來(lái)回走動(dòng)的.實(shí)現(xiàn)用戶級(jí)與系統(tǒng)級(jí)的調(diào)用跳轉(zhuǎn).
2.1數(shù)據(jù)段與堆棧段
? ? 所有的數(shù)據(jù)段都是非一致性的,就是說(shuō)他們不能被低特權(quán)級(jí)的程序訪問(wèn),但是可以被高特權(quán)級(jí)的程序訪問(wèn)而不需使用特殊的訪問(wèn)門(mén)。這里,RPL可能會(huì)削弱CPL的作用,訪問(wèn)數(shù)據(jù)段或堆棧段時(shí),默認(rèn)用CPL和RPL中的最小特權(quán)級(jí)去訪問(wèn)數(shù)據(jù)段,所以max?{CPL,?RPL}?≤?DPL,否則訪問(wèn)失敗。
2.2代碼段?
? ? ??
???? ? 轉(zhuǎn)跳后程序的CPL(CS.RPL)只會(huì)有下面的倆種可能
1)轉(zhuǎn)跳后程序的CPL(CS.RPL)=轉(zhuǎn)跳前程序的CPL(CS.RPL)
2)或轉(zhuǎn)跳后程序的CPL(CS.RPL)= 轉(zhuǎn)跳后程序的CodeDescriptor.DPL
準(zhǔn)則:RPL是不會(huì)賦值給CPL的
? ?如何決定跳轉(zhuǎn)之后CPL的值呢?
1)如果能成功轉(zhuǎn)跳到一致代碼段,轉(zhuǎn)跳后程序的CPL(CS.RPL)=轉(zhuǎn)跳前程序的CPL(CS.RPL),(轉(zhuǎn)跳后程序的CPL繼承了轉(zhuǎn)跳前程序的CPL,一致一致,翻譯時(shí)一致含義就是這個(gè)意思!)
2)如果能成功轉(zhuǎn)跳到非一致代碼段,轉(zhuǎn)跳后程序的CPL(CS.RPL) =轉(zhuǎn)跳后程序的Descriptor.DPL。(轉(zhuǎn)跳后程序的CPL變成了該代碼段的特權(quán)級(jí).我在前面提到DPL是段描述符中的特權(quán)級(jí),它的本意是用來(lái)代表它所描述的段的特權(quán)級(jí))
2.3.一致性代碼與非一致性代碼段
? ? 什么是一致代碼和非一致代碼段?為什么要作這個(gè)區(qū)別?
? ? 代碼段可以是一致性的或者非一致性的。向特權(quán)級(jí)更高的一致性代碼段的控制轉(zhuǎn)移,允許程序以當(dāng)前特權(quán)級(jí)繼續(xù)執(zhí)行,向不同特權(quán)級(jí)的非一致代碼段轉(zhuǎn)移將導(dǎo)致一般保護(hù)異常,除非使用了任務(wù)門(mén)或者調(diào)用門(mén)。產(chǎn)生一致性代碼和非一致性代碼的主要原因是:單純的0-3特權(quán)級(jí)只能保證高特權(quán)級(jí)可以訪問(wèn)特權(quán)級(jí)的東西,而低特權(quán)級(jí)的段有時(shí)候要訪問(wèn)內(nèi)核數(shù)據(jù)段,此時(shí)就需要一些靈活策略。
? ? 不訪問(wèn)保護(hù)措施的系統(tǒng)工具和某些異常類(lèi)型的處理過(guò)程需要放在一致性代碼段中。需要防止低特權(quán)級(jí)程序訪問(wèn)的工具要放在非一致代碼段中。
1)一致代碼段:
簡(jiǎn)單理解,就是操作系統(tǒng)拿出來(lái)被共享的代碼段,可以被低特權(quán)級(jí)的用戶直接調(diào)用訪問(wèn)的代碼.
通常這些共享代碼,是"不訪問(wèn)"受保護(hù)的資源和某些類(lèi)型異常處理。比如一些數(shù)學(xué)計(jì)算函數(shù)庫(kù),為純粹的數(shù)學(xué)運(yùn)算計(jì)算,
一致代碼段的限制作用
1.1).特權(quán)級(jí)高的程序不允許訪問(wèn)特權(quán)級(jí)低的數(shù)據(jù):核心態(tài)不允許調(diào)用用戶態(tài)的數(shù)據(jù).
1.2).特權(quán)級(jí)低的程序可以訪問(wèn)到特權(quán)級(jí)高的數(shù)據(jù).但是特權(quán)級(jí)不會(huì)改變:用戶態(tài)還是用戶態(tài).
2)非一致代碼段:
為了避免低特權(quán)級(jí)的訪問(wèn)而被操作系統(tǒng)保護(hù)起來(lái)的系統(tǒng)代碼.
非一致代碼段的限制作用
2.1).只允許同級(jí)間訪問(wèn).
2.2).絕對(duì)禁止不同級(jí)訪問(wèn):核心態(tài)不用用戶態(tài).用戶態(tài)也不使用核心態(tài).
通常低特權(quán)代碼必須通過(guò)"門(mén)"來(lái)實(shí)現(xiàn)對(duì)高特權(quán)代碼的訪問(wèn)和調(diào)用.
2.4段間成功跳轉(zhuǎn)的條件
? ??明晰一些概念:段的保護(hù)觀念是高特權(quán)級(jí)不找低特權(quán)級(jí)辦事,低特權(quán)級(jí)找高特權(quán)級(jí)幫忙;但是低特權(quán)級(jí)不能直接處理一些事情,而高特權(quán)級(jí)可以訪問(wèn)低特權(quán)級(jí)。(好吧,這句話好像矛盾了)
? ? 具體而言:還是要問(wèn)怎樣才能成功轉(zhuǎn)跳?這里分兩種情況:
2.4.1普通轉(zhuǎn)跳(沒(méi)有經(jīng)過(guò)Gate?這東西):
?
? 即JMP或Call后跟著48位全指針(16位段選擇子+32位地址偏移),且其中的段選擇子指向代碼段描述符,這樣的跳轉(zhuǎn)稱(chēng)為直接(普通)跳轉(zhuǎn)。普通跳轉(zhuǎn)不能使特權(quán)級(jí)發(fā)生躍遷,即不會(huì)引起CPL的變化,看下面的詳細(xì)描述:
1)目標(biāo)是一致代碼段:
要求:CPL(CS.RPL)>=DestinationDescriptorCode.DPL?,其他RPL是不檢查的。
原因:一致性代碼設(shè)計(jì)的初衷就是讓低特權(quán)級(jí)可以訪問(wèn)到高特權(quán)級(jí)的東西
結(jié)果:CPL不變
異常原因:CPL<DPL
總結(jié):一致性代碼,不允許高特權(quán)級(jí)訪問(wèn)低特權(quán)級(jí)的內(nèi)容。
2)目標(biāo)是非一致代碼段:
要求:CPL(CS.RPL)=DestinationDescriptorCode.DPL ANDRPL≤CPL(CS.RPL)
原因:非一致性代碼的設(shè)計(jì)初衷就是讓低特權(quán)級(jí)無(wú)法接觸到高特權(quán)級(jí)的代碼。
結(jié)果:CPL不變
異常原因:如果訪問(wèn)時(shí)不滿足前提CPL=DPL,則引發(fā)異常。
總結(jié):非一致性代碼,只允許同特權(quán)級(jí)的進(jìn)程之間互相訪問(wèn)。
2.4.2通過(guò)調(diào)用門(mén)的跳轉(zhuǎn):
? ? 當(dāng)段間轉(zhuǎn)移指令JMP和段間轉(zhuǎn)移指令CALL后跟著的目標(biāo)段選擇子指向一個(gè)調(diào)用門(mén)描述符時(shí),該跳轉(zhuǎn)就是利用調(diào)用門(mén)的跳轉(zhuǎn)。這時(shí)如果選擇子后跟著32位的地址偏移,也不會(huì)被cpu使用,因?yàn)檎{(diào)用門(mén)描述符已經(jīng)記錄了目標(biāo)代碼的偏移。使用調(diào)門(mén)進(jìn)行的跳轉(zhuǎn)比普通跳轉(zhuǎn)多一個(gè)步驟,即在訪問(wèn)調(diào)用門(mén)描述符時(shí)要將描述符當(dāng)作一個(gè)數(shù)據(jù)段來(lái)檢查訪問(wèn)權(quán)限,要求指示調(diào)用門(mén)的選擇子的RPL≤門(mén)描述符DPL,同時(shí)當(dāng)前代碼段CPL≤門(mén)描述符DPL,就如同訪問(wèn)數(shù)據(jù)段一樣,要求訪問(wèn)數(shù)據(jù)段的程序的CPL≤待訪問(wèn)的數(shù)據(jù)段的DPL,同時(shí)選擇子的RPL≤待訪問(wèn)的數(shù)據(jù)段或堆棧段的DPL。只有滿足了以上條件,CPU才會(huì)進(jìn)一步從調(diào)用門(mén)描述符中讀取目標(biāo)代碼段的選擇子和地址偏移,進(jìn)行下一步的操作。
???從調(diào)用門(mén)中讀取到目標(biāo)代碼的段選擇子和地址偏移后,我們當(dāng)前掌握的信息又回到了先前,和普通跳轉(zhuǎn)站在了同一條起跑線上(普通跳轉(zhuǎn)一開(kāi)始就得到了目標(biāo)代碼的段選擇子和地址偏移),有所不同的是,此時(shí),CPU會(huì)將讀到的目標(biāo)代碼段選擇子中的RPL清0,即忽略了調(diào)用門(mén)中代碼段選擇子的RPL的作用。完成這一步后,CPU開(kāi)始對(duì)當(dāng)前程序的CPL,目標(biāo)代碼段選擇子的RPL(事實(shí)上它被清0后總能滿足要求)以及由目標(biāo)代碼選擇子指示的目標(biāo)代碼段描述符中的DPL進(jìn)行特權(quán)級(jí)檢查,并根據(jù)情況進(jìn)行跳轉(zhuǎn),具體情況如下:
目標(biāo)是一致代碼段:
要求:CPL(CS.RPL)≥DestinationDescriptorCode.DPL?,RPL不檢查,因?yàn)?/span>RPL被清0,所以事實(shí)上永遠(yuǎn)滿足RPL≤DPL,這一點(diǎn)與普通跳轉(zhuǎn)一致,適用于JMP和CALL。
?????????轉(zhuǎn)跳后程序的CPL(NewCS.RPL)?=?轉(zhuǎn)跳前程序的CPL(?OldCS.RPL),因此特權(quán)級(jí)沒(méi)有發(fā)生躍遷。?
? ? ? ? ? ? ? ? ? ? ? ? ?
目標(biāo)是非一致代碼段:
???當(dāng)用JMP指令跳轉(zhuǎn)時(shí):
????要求:CPL(CS.RPL)=DestinationDescriptorCode.DPL AND??RPL<=?CPL(CS.RPL)(事實(shí)上因?yàn)?/span>RPL被清0,所以RPL≤CPL總能滿足,因此RPL與CPL的關(guān)系在此不檢查)。若不滿足要求則程序引起異常。
?????????轉(zhuǎn)跳后程序的CPL(NewCS.RPL)?=?DestinationDescriptorCode.DPL
????因?yàn)榍疤崾?/span>CPL=DPL,所以轉(zhuǎn)跳后程序的CPL(NewCS.RPL)?=?DestinationDescriptorCode.DPL不會(huì)改變CPL的值,特權(quán)級(jí)也沒(méi)有發(fā)生變化。如果訪問(wèn)時(shí)不滿足前提CPL=DPL,則引發(fā)異常。
當(dāng)用CALL指令跳轉(zhuǎn)時(shí):
????要求:CPL(CS.RPL)≥DestinationDescriptorCode.DPL(RPL被清0,不檢查),若不滿足要求則程序引起異常。
?????????轉(zhuǎn)跳后程序的CPL(NewCS.RPL)?=?DestinationDescriptorCode.DPL
????當(dāng)條件CPL=DPL時(shí),程序跳轉(zhuǎn)后CPL=DPL,特權(quán)級(jí)不發(fā)生躍遷;當(dāng)CPL>DPL時(shí),程序跳轉(zhuǎn)后CPL=DPL,特權(quán)級(jí)發(fā)生躍遷,這是我們當(dāng)目前位置唯一見(jiàn)到的使程序當(dāng)前執(zhí)行優(yōu)先級(jí)(CPL)發(fā)生變化的跳轉(zhuǎn)方法,即用CALL指令+調(diào)用門(mén)方式跳轉(zhuǎn),且目標(biāo)代碼段是非一致代碼段。
????總結(jié):以上介紹了兩種情況的跳轉(zhuǎn),分別是普通跳轉(zhuǎn)和使用調(diào)用門(mén)的跳轉(zhuǎn),其中又可細(xì)分為JMP跳轉(zhuǎn)和CALL跳轉(zhuǎn),跳轉(zhuǎn)成功已否是由CPL,RPL和DPL綜合決定的。所有跳轉(zhuǎn)都是從低特權(quán)級(jí)代碼向同級(jí)或更高特權(quán)級(jí)(DPL)跳轉(zhuǎn),但保持當(dāng)前執(zhí)行特權(quán)級(jí)(CPL)不變,這里有點(diǎn)難于區(qū)別為什么說(shuō)向高特權(quán)級(jí)跳轉(zhuǎn),又說(shuō)特權(quán)級(jí)沒(méi)變,這里“高特權(quán)級(jí)”是指目標(biāo)代碼段描述符的DPL,它規(guī)定了可以跳轉(zhuǎn)到該段代碼的最高特權(quán)級(jí);而后面的CPL不變才真正說(shuō)明了特權(quán)級(jí)未發(fā)生躍遷。我們可以看到,只有用CALL指令
《新程序員》:云原生和全面數(shù)字化實(shí)踐50位技術(shù)專(zhuān)家共同創(chuàng)作,文字、視頻、音頻交互閱讀總結(jié)
以上是生活随笔為你收集整理的CPL DPL RPL的区别 一致性代码段和非一致性代码段的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 一致性代码段和非一致性代码段【转】
- 下一篇: 统一代码段与非一致代码段