1.當前特權CPL(Current Privilege Level)
CPL是當前進程的權限級別(Current Privilege Level),是當前正在執行的代碼所在的段的特權級,存在于cs寄存器的低兩位。
2.描述符特權級DPL(Descriptor Privilege Level)
DPL存儲在段描述符中,規定訪問該段的權限級別(Descriptor Privilege Level),每個段的DPL固定。
3.請求特權級RPL(Request Privilege Level)
RPL保存在選擇子的最低兩位。RPL說明的是進程對段訪問的請求權限,意思是當前進程想要的請求權限。RPL的值由程序員自己來自由的設置,并不一定RPL>=CPL,但是當RPL<CPL時,實際起作用的就是CPL了,因為訪問時的特權檢查是判斷:EPL=max(RPL,CPL)<=DPL是否成立,所以RPL可以看成是每次訪問時的附加限制,RPL=0時附加限制最小,RPL=3時附加限制最大。所以你不要想通過來隨便設置一個RPL來訪問一個比CPL更內層的段。
對于為甚麼在CPL之外在增加一個RPL的原因:
Intel手冊上的解釋為: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.
(RPL能夠用來確保具有特權級的代碼不會代表另一個應用程序去訪問一個段,除非那個應用程序具有訪問那個段的權限.)
比方說:A進程的DPL為0,C進程的DPL為1,現在有一個B進程他的DPL為2,這B進程想委托A進程去訪問C的數據,如果沒有RPL的話這樣的委托訪問是可以成功的,但這樣是非常不安全的。有了RPL以后A進程在訪問C的時候還要受到RPL的約束,此時可以將訪問C的選擇子的RPL設為B的DPL,這樣A的訪問權限就相當為EPL=max(RPL,DPL)=2,這樣他就無法代表B去越權訪問C了。
在網上還有一個形象的例子,一起貼出來:
一個農民(低特權級)請縣長(高特權級)打聽一種超級種子,如果找到的話幫忙拿一點回來,聽聞這種超級種子可讓收成倍增。縣長說:好!我認識很多當官的,我可以幫你打聽一下哪里有,但是有些地方如果需要表示身分的話我只能說我是農民的代理人。縣長利用自己的身份很容易找到了種子在哪里---找的時候沒有人問起他代表誰。縣長問種子管理員可不可以給他一點,管理員說種子不能給農民因為種子還在試驗階段,我們可以給縣長讓他們帶回當地的專家來幫忙一起做試驗,但是一定要縣長來申請。那你是誰?縣長說我是農民的代理人,因為縣長保證他會這樣回答的(他也不知道那農民是不是專家),管理員當然不給。縣長沒辦法只能告訴農民拿不到種子。這件事里面縣長是以縣長的身份幫農民找到種子,但需要表示身分的時候他說只是農民的代理人。這樣做縣長可以幫人但也不會給別人利用。(農民可能把種子拿回來賣錢也說不定,沒人知道)
在這里RPL就是縣長的另一個身份---農民的代理人也就是農民---他會帶在身上,人家沒有問他的時候他不會告訴別人,所以別人也就以縣長的身分來看待他。當查身份的時候他才告訴你---我是農民的代理人。
posted on 2008-10-08 20:28
楊彬彬 閱讀(1782)
評論(0) 編輯 收藏 引用 所屬分類:
操作系統