日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

CPL DPL RPL的区别 一致性代码段和非一致性代码段

發布時間:2025/6/15 编程问答 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 CPL DPL RPL的区别 一致性代码段和非一致性代码段 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
概述:在談論保護模式編程的時候,一直會有這樣的困惑:為什么除了CPLDPL還有RPL?什么時候高特權級不能訪問低特權級?什么時候低特權級不能訪問高特權級?一致性代碼和非一致性代碼有什么區別?等等這些問題,如果僅僅停留在知其然的級別,很容易會困惑,本文主要說明以上問題的答案和蘊涵在背后的原因。


1.特權級


? ? ? ?首先,了解以下操作系統的特權級

? ? 1CPL是存寄存器如CS,當前特權級只有03兩個值,分別表示用戶態和內核態。

? ? 2RPL是代碼中根據不同段跳轉而確定,以動態刷新CS里的CPL,在代碼段選擇符中而且RPL對每個段來說不是固定的,兩次訪問同一段時的RPL可以不同。

? ? 3DPL是在GDT/LDT描述符表中,靜態的。

? ? RPL是用來做什么的?

? ? Intel手冊上的解釋為: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能夠用來確保具有特權級的代碼不會代表另一個應用程序去訪問一個段,除非那個應用程序具有訪問那個段的權限.

? ? 比方說:A進程的DPL0C進程的DPL1,現在有一個B進程他的DPL2,這B進程想委托A進程去訪問C的數據,如果沒有RPL的話這樣的委托訪問是可以成功的,但這樣是非常不安全的(實際上B沒有訪問C的權限,但是A有這個權限)。有了RPL以后A進程在訪問C的時候還要受到RPL的約束,此時可以將訪問C的選擇子的RPL設為BDPL這樣A的訪問權限就相當為EPL=maxRPLDPL=2,這樣他就無法代表B去越權訪問C了。RPL相當于附加的一個權限控制,只有當RPL>DPL的時候,才起到實際的限制作用。


簡單的說就是這樣:B需要委托A去到C那里辦理某件事情,但是A的權利太大,所以需要附加委托人的權利。用一個不恰當的比喻,你爺爺是皇帝,你爸爸是太子,你是太子的兒子,你爺爺還有很多孫子;其中太子的請求,如果不考慮其他因素,皇帝都會答應;你要去對皇帝遞交某個請求,來請你爸爸傳遞,你爺爺看見是你爸爸,還要核對你爸爸是幫誰傳遞的請求,如果是幫你,你皇帝爺爺就批準了,如果你爸爸是遞交的外人的請求,你爺爺未必會批準。

2.段間的轉移和跳轉


程序是通過選擇子/門調用等等來在段之間來回走動的.實現用戶級與系統級的調用跳轉.


2.1數據段與堆棧段

? ? 所有的數據段都是非一致性的,就是說他們不能被低特權級的程序訪問,但是可以被高特權級的程序訪問而不需使用特殊的訪問門。這里,RPL可能會削弱CPL的作用,訪問數據段或堆棧段時,默認用CPLRPL中的最小特權級去訪問數據段,所以max?{CPL,?RPL}?≤?DPL否則訪問失敗。

2.2代碼段?
? ? ??

???? ? 轉跳后程序的CPL(CS.RPL)只會有下面的倆種可能

1)轉跳后程序的CPL(CS.RPL)=轉跳前程序的CPL(CS.RPL)
2)
或轉跳后程序的CPL(CS.RPL)= 轉跳后程序的CodeDescriptor.DPL

準則:RPL是不會賦值給CPL的

? ?如何決定跳轉之后CPL的值呢?

1)如果能成功轉跳到一致代碼段,轉跳后程序的CPL(CS.RPL)=轉跳前程序的CPL(CS.RPL)(轉跳后程序的CPL繼承了轉跳前程序的CPL,一致一致,翻譯時一致含義就是這個意思!)
2
如果能成功轉跳到非一致代碼段,轉跳后程序的CPL(CSRPL) =轉跳后程序的Descriptor.DPL(轉跳后程序的CPL變成了該代碼段的特權級.我在前面提到DPL是段描述符中的特權級,它的本意是用來代表它所描述的段的特權級)

2.3.一致性代碼與非一致性代碼段

? ? 什么是一致代碼和非一致代碼段?為什么要作這個區別?

? ? 代碼段可以是一致性的或者非一致性的。向特權級更高的一致性代碼段的控制轉移,允許程序以當前特權級繼續執行,向不同特權級的非一致代碼段轉移將導致一般保護異常,除非使用了任務門或者調用門。產生一致性代碼和非一致性代碼的主要原因是:單純的0-3特權級只能保證高特權級可以訪問特權級的東西,而低特權級的段有時候要訪問內核數據段,此時就需要一些靈活策略。

? ? 不訪問保護措施的系統工具和某些異常類型的處理過程需要放在一致性代碼段中。需要防止低特權級程序訪問的工具要放在非一致代碼段中。

1)一致代碼段:

簡單理解,就是操作系統拿出來被共享的代碼段,可以被低特權級的用戶直接調用訪問的代碼.

通常這些共享代碼,是"不訪問"受保護的資源和某些類型異常處理。比如一些數學計算函數庫,為純粹的數學運算計算,

一致代碼段的限制作用

1.1).特權級高的程序不允許訪問特權級低的數據:核心態不允許調用用戶態的數據.
1.2).
特權級低的程序可以訪問到特權級高的數據.但是特權級不會改變:用戶態還是用戶態.

2)非一致代碼段:

為了避免低特權級的訪問而被操作系統保護起來的系統代碼.

非一致代碼段的限制作用

2.1).只允許同級間訪問.
2.2).
絕對禁止不同級訪問:核心態不用用戶態.用戶態也不使用核心態.

通常低特權代碼必須通過""來實現對高特權代碼的訪問和調用.


2.4段間成功跳轉的條件

? ??明晰一些概念:段的保護觀念是高特權級不找低特權級辦事,低特權級找高特權級幫忙;但是低特權級不能直接處理一些事情,而高特權級可以訪問低特權級。(好吧,這句話好像矛盾了)

? ? 具體而言:還是要問怎樣才能成功轉跳?這里分兩種情況:


2.4.1普通轉跳(沒有經過Gate?這東西):

?
? 即
JMPCall后跟著48位全指針(16位段選擇子+32位地址偏移),且其中的段選擇子指向代碼段描述符,這樣的跳轉稱為直接(普通)跳轉。普通跳轉不能使特權級發生躍遷,即不會引起CPL的變化,看下面的詳細描述:

1)目標是一致代碼段:
要求:CPL(CS.RPL)>=DestinationDescriptorCode.DPL?,其他RPL是不檢查的。
原因:一致性代碼設計的初衷就是讓低特權級可以訪問到高特權級的東西

結果:CPL不變

異常原因:CPL<DPL

總結:一致性代碼,不允許高特權級訪問低特權級的內容。

2目標是非一致代碼段:
要求:
CPL(CS.RPL)=DestinationDescriptorCode.DPL ANDRPL≤CPL(CS.RPL)
原因:非一致性代碼的設計初衷就是讓低特權級無法接觸到高特權級的代碼。

結果:CPL不變
異常原因:如果訪問時不滿足前提CPL=DPL,則引發異常。

總結:非一致性代碼,只允許同特權級的進程之間互相訪問。


2.4.2通過調用門的跳轉:

? ? 當段間轉移指令JMP和段間轉移指令CALL后跟著的目標段選擇子指向一個調用門描述符時,該跳轉就是利用調用門的跳轉。這時如果選擇子后跟著32位的地址偏移,也不會被cpu使用,因為調用門描述符已經記錄了目標代碼的偏移。使用調門進行的跳轉比普通跳轉多一個步驟,即在訪問調用門描述符時要將描述符當作一個數據段來檢查訪問權限,要求指示調用門的選擇子的RPL≤門描述符DPL,同時當前代碼段CPL≤門描述符DPL,就如同訪問數據段一樣,要求訪問數據段的程序的CPL≤待訪問的數據段的DPL,同時選擇子的RPL≤待訪問的數據段或堆棧段的DPL。只有滿足了以上條件,CPU才會進一步從調用門描述符中讀取目標代碼段的選擇子和地址偏移,進行下一步的操作。

???從調用門中讀取到目標代碼的段選擇子和地址偏移后,我們當前掌握的信息又回到了先前,和普通跳轉站在了同一條起跑線上(普通跳轉一開始就得到了目標代碼的段選擇子和地址偏移),有所不同的是,此時,CPU會將讀到的目標代碼段選擇子中的RPL0,即忽略了調用門中代碼段選擇子的RPL的作用。完成這一步后,CPU開始對當前程序的CPL,目標代碼段選擇子的RPL(事實上它被清0后總能滿足要求)以及由目標代碼選擇子指示的目標代碼段描述符中的DPL進行特權級檢查,并根據情況進行跳轉,具體情況如下:

目標是一致代碼段:
要求:CPL(CS.RPL)≥DestinationDescriptorCode.DPL?RPL不檢查,因為RPL被清0,所以事實上永遠滿足RPL≤DPL,這一點與普通跳轉一致,適用于JMPCALL
?????????
轉跳后程序的CPL(NewCS.RPL)?=?轉跳前程序的CPL(?OldCS.RPL),因此特權級沒有發生躍遷。?
? ? ? ? ? ? ? ? ? ? ? ? ?

目標是非一致代碼段:

???當用JMP指令跳轉時:
????
要求:CPL(CS.RPL)DestinationDescriptorCode.DPL AND??RPL<=?CPL(CS.RPL)(事實上因為RPL被清0,所以RPL≤CPL總能滿足,因此RPLCPL的關系在此不檢查)。若不滿足要求則程序引起異常。
?????????
轉跳后程序的CPL(NewCS.RPL)?=?DestinationDescriptorCode.DPL
????
因為前提是CPL=DPL,所以轉跳后程序的CPL(NewCS.RPL)?=?DestinationDescriptorCode.DPL不會改變CPL的值,特權級也沒有發生變化。如果訪問時不滿足前提CPL=DPL,則引發異常。

當用CALL指令跳轉時:

????要求:CPL(CS.RPL)≥DestinationDescriptorCode.DPLRPL被清0,不檢查),若不滿足要求則程序引起異常。

?????????轉跳后程序的CPL(NewCS.RPL)?=?DestinationDescriptorCode.DPL

????當條件CPL=DPL時,程序跳轉后CPL=DPL,特權級不發生躍遷;當CPLDPL時,程序跳轉后CPL=DPL,特權級發生躍遷,這是我們當目前位置唯一見到的使程序當前執行優先級(CPL)發生變化的跳轉方法,即用CALL指令+調用門方式跳轉,且目標代碼段是非一致代碼段。

????總結:以上介紹了兩種情況的跳轉,分別是普通跳轉和使用調用門的跳轉,其中又可細分為JMP跳轉和CALL跳轉,跳轉成功已否是由CPLRPLDPL綜合決定的。所有跳轉都是從低特權級代碼向同級或更高特權級(DPL)跳轉,但保持當前執行特權級(CPL)不變,這里有點難于區別為什么說向高特權級跳轉,又說特權級沒變,這里“高特權級”是指目標代碼段描述符的DPL,它規定了可以跳轉到該段代碼的最高特權級;而后面的CPL不變才真正說明了特權級未發生躍遷。我們可以看到,只有用CALL指令

《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀

總結

以上是生活随笔為你收集整理的CPL DPL RPL的区别 一致性代码段和非一致性代码段的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。