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