【OS学习笔记】二十四 保护模式七:调用门与依从的代码段----特权级保护
學習交流加
- 個人qq:
1126137994 - 個人微信:
liu1126137994 - 學習交流資源分享qq群:
962535112
上一篇文章學習了保護模式下的任務與任務隔離,以及簡單介紹了保護模式下的特權級的概念。點擊鏈接查看上一篇文章:任務與任務隔離
今天具體來學習一下保護模式下的特權級保護。
主要學習以下內(nèi)容;
-
描述符特權級(目標對象的特權級)DPL
-
當前特權級CPL
-
低特權級的應用調用高特權級的操作系統(tǒng)代碼的兩種方法
- 第一種方法是將高特權級的代碼段定義為依從的
- 第二種方法是使用調用門
-
請求特權級RPL
文章目錄
- 1、描述符特權級DPL
- 2、當前特權級CPL
- 3、如何將代碼段轉移到另一個代碼段
- 3.1 將高特權級的代碼段定義為依從的
- 3.2 調用門
- 4、總結
1、描述符特權級DPL
實施特權級保護的第一步,是為所有可管理的對象賦予一個特權級,以決定誰能訪問它們。在這篇文章中保護模式二:段描述符,我們學習了描述符的格式,如下圖。
每個描述符都有一個兩比特的DPL字段。可取值為0,1,2,3 。DPL是每個描述符都有的字段,稱為描述符特權級,而描述符總是指向它所描述的目標的對象,代表著該對象,因此,該字段實際上是目標對象的特權級。
比如對于數(shù)據(jù)段來說,DPL決定了訪問它們所應具備的最低特權級別。如果一個描述符的DPL字段為2,那么能夠訪問該數(shù)據(jù)段的只有特權級為0,1,2的程序。當一個特權級為3的程序訪問該數(shù)據(jù)段的時候,將會被處理器阻止,并引發(fā)異常中斷。
對任何段的訪問都要先把該段的描述符加載到段寄存器,所以這種保護手段很容易實現(xiàn)。
2、當前特權級CPL
在實模式下,段寄存器存放的是段地址;而在保護模式下,段寄存器存放的是段選擇子與描述符高速緩存器。當處理器正在一個代碼段中取指令和執(zhí)行指令時,那個代碼段的特權級叫做當前特權級CPL。
正在執(zhí)行的這個代碼段,其選擇子位于段寄存器CS中,其最低兩位就是當前特權級的數(shù)值。
在一個任務中,有全局空間和局部空間。一般來說任務的全局空間是操作系統(tǒng)的函數(shù),特權級是0。任務的局部空間一般是任務自己的函數(shù),特權級是3。
那些只能在當前特權級CPL為0的時候才能執(zhí)行的指令,稱為特權指令。典型的特權指令如加載全局描述符表的lgdt、加載局部描述符表的指令lldt、停機指令hlt等。
3、如何將代碼段轉移到另一個代碼段
代碼段的特權級檢查是很嚴格的,一般來說,控制轉移只允許發(fā)生在兩個特權級相同的代碼段之間。
不過為了讓特權級低的用戶程序可以調用特權級高的內(nèi)核程序,處理器也提供了相應的解決辦法。
- 第一種辦法是將高特權級的代碼定義為依從的
- 使用調用門
3.1 將高特權級的代碼段定義為依從的
在這篇文章里保護模式二:段描述符,我們學習了段描述符,有一個TYPE字段。代碼段的TYPE字段有一個C位,如果C=0,這樣的代碼段只能供同特權級的代碼段調用;否則如果C=1,則這樣的代碼段稱為依從的代碼段,可以從特權級比它低的程序調用并進入。
注意,即使是將控制轉移到依從的代碼段,也必須是低特權級的程序調用高特權級的代碼并進入。而不能是從高特權級的代碼轉移到低特權級的代碼。內(nèi)核的代碼已經(jīng)很牛逼了,它是不會想要調用你的用戶程序的代碼的,就是這個道理。
上述轉移到依從代碼段的要求可以用一個表達式來傳達:
CPL>=目標代碼段描述符的DPL
依從的代碼段不是在它的DPL特權級上運行,而是在調用程序的特權級上運行。也就是說,當控制權轉移到依從的代碼段后,不改變當前特權級CPL,段寄存器CS的CPL不發(fā)生變化,被調用過程的特權級依從于調用者的特權級。這就是為什么它被稱為依從的代碼段。
3.2 調用門
除了依從大代碼段,另一種在特權級之間轉移控制的方法是使用門。
門是另一種形式的描述符。稱為門描述符,簡稱門。和段描述符不同,段描述符用于描述內(nèi)存段。門用于描述可執(zhí)行代碼,比如一段程序,一個過程,或者一個任務。
實際上,門的類型有好幾種。不同特權級之間的過程調用可以使用調用門;中斷門/陷阱門是作為中斷處理過程使用的;任務門對應單個的任務,用來執(zhí)行任務切換。在本文,我們重點學習調用門。
所有的描述符都是64位的,調用門描述符也不例外。在調用門的描述符中,定義了目標過程(例程)所在代碼段的選擇子,以及段內(nèi)偏移。要想使用調用門進行控制轉移,可以使用jmp far或者call far指令,并把調用門的=描述符的選擇子作為操作數(shù)。
使用jmp far指令,可以將控制通過門轉移到比當前特權級高的代碼段,但不改變當前特權級別。但是如果使用call far 指令,則當前特權級會提升到目標代碼段的特權級。
在繼續(xù)學習調用門前,我們有一個知識點需要補充。那就是請求特權級RPL。
我們知道,要將一個控制從一個代碼段轉移到另一個代碼段,通常是使用jmp或者call指令,并在指令中提供目標代碼的段選擇子,以及段內(nèi)偏移量。而為了訪問內(nèi)存中的數(shù)據(jù),也必須將段選擇子加載到寄存器DS、ES、FS或者GS。不管是實施控制轉移,還是訪問數(shù)據(jù),這都可以看成是一個請求,請求者提供一個段選擇子,請求訪問指定的段。從這個意義上來講,RPL也就是指請求者的特權級別。
在絕大多數(shù)情況下,請求者都是當前程序自己,因此CPL=RPL。要判斷請求者是誰,最簡單的方法是看誰提供的選擇子,誰就是請求者。
但是在一些并不多見的情況下,RPL和CPL并不相同。如下圖,特權級為3的應用程序,希望從硬盤讀一個扇區(qū),并傳送到自己的數(shù)據(jù)段,因此數(shù)據(jù)段的DPL是3.
上圖中,應用程序通過調用門調用內(nèi)核例程,請求者是用戶程序,即RPL=3.但是真正讀硬盤的是內(nèi)核例程,通過調用門會改變當前特權級,進入內(nèi)核示例后,CPL=0. 此時RPL與CPL就不相同。
不過,上面的例子只是表明RPL有可能與CPL不同,但是并沒有說明引入RPL到底有什么必要性。
我們再看下面的一個例子:
假設用戶程序不知道從哪里得知了操作系統(tǒng)內(nèi)核的數(shù)據(jù)段的選擇子。而且該用戶程序想要改變該內(nèi)核數(shù)據(jù)段的內(nèi)容。它雖然不可以直接讀寫內(nèi)核的數(shù)據(jù)段,但是它可以通過調用門,調用操作系統(tǒng)例程,當前特權級變?yōu)?,可以從硬盤讀數(shù)據(jù),并將他們寫到操作系統(tǒng)的數(shù)據(jù)段。這下就糟糕了,這肯定會破壞操作系統(tǒng)。
怎么辦????
看的出來,單純依靠處理器硬件的檢查機制無法解決這個難題,但它可以在原來的基礎上做增加一種檢查機制,并把如何通過這種檢查的規(guī)則交給軟件(編寫者)
那么此時RPL就派上用場了。每當處理器執(zhí)行一個將段選擇子傳送給段寄存器的指令時,會檢查以下兩個條件是否滿足。
- 當前特權級CPL高于或者和數(shù)據(jù)段描述符的DPL相同。即在數(shù)值上有:CPL<=數(shù)據(jù)段描述符的DPL。
- 請求特權級RPL高于或者和數(shù)據(jù)段描述符的DPL相同。即在數(shù)值上有:RPL<=數(shù)據(jù)段描述符的DPL。
如果以上兩個條件不能同時成立,處理器會阻止這種操作,并引發(fā)異常中斷。
所以在上圖所示的例子中,當用戶程序想要寫內(nèi)核的數(shù)據(jù)段,通過調用門調用內(nèi)核例程后,當前特權級CPL與數(shù)據(jù)段描述符的DPL都是0,滿足第一個條件。但是RPL=3,數(shù)據(jù)段的DPL=0,不滿足第二個條件,所以處理器引發(fā)異常中斷。
以上就是引入RPL的作用。它也是特權級保護的重要特性之一。
4、總結
最后我們來總結一下基本的特權級檢查規(guī)則。
-
首先,將控制直接轉移到非依從的代碼段,要求當前特權級CPL和請求特權級RPL都等于目標代碼段的描述符的DPL。即在數(shù)值上有:
CPL=目標代碼段描述符的DPL
RPL=目標代碼段描述符的DPL
一個典型的例子就是jmp指令進行控制轉移(jmp指令不改變當前特權級)
-
其次,要將控制轉移到依從的代碼段,要求當前特權級CPL和請求特權級RPL都低于或者和目標代碼的DPL相等。即在數(shù)值上有:
CPL>=目標代碼段描述符的DPL
RPL>=目標代碼段描述符的DPL
控制轉移后,當前特權級保持不變。
-
第三,高特權級別的程序可以訪問低特權級別的數(shù)據(jù)段,但是低特權級別的程序不能訪問高特權級別的數(shù)據(jù)段。訪問數(shù)據(jù)段之前,肯定會修改數(shù)據(jù)段寄存器,在這個時候,要求當前特權級與請求特權級都必須高于或者和目標數(shù)據(jù)段的DPL相等。即在數(shù)值上有:
CPL<=目標數(shù)據(jù)段描述符的DPL
RPL<=目標數(shù)據(jù)段描述符的DPL -
最后,在任何時候,處理器要求棧段的特權級別必須和當前特權級CPL相同。
詳細的內(nèi)容還是要參考原書籍,這里只是做一個簡單的總結。
學習探討加個人:
qq:1126137994
微信:liu1126137994
總結
以上是生活随笔為你收集整理的【OS学习笔记】二十四 保护模式七:调用门与依从的代码段----特权级保护的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python中输出n开始的5个奇数_送你
- 下一篇: 门限回归模型的思想_Stata+R:门槛