1. 程式人生 > >保護模式總結(二)——任務和特權級

保護模式總結(二)——任務和特權級

       32位保護模式相對真實模式來說,除了記憶體保護,還多了一大功能,那就是多工。今天總結的內容就從多工入手。

       程式本質上是指令和資料,任務是程式為了完成某個特定的工作而執行的一個副本。

       這是抽象的描述,任務在計算機中具體是由什麼描述的呢?下面引入LDT和TSS的概念。

       LDT:區域性描述符表Local Descriptor Table。

       TSS:任務狀態段Task State Segment。

先看圖:

                       

       下面來具體介紹一下。任務和任務之間需要實施隔離,以免發生衝突。於是每個任務都會有自己的全域性空間和區域性空間。全域性空間是所有任務共有的,含有作業系統的軟體和庫程式,以及可以呼叫的系統服務和資料;私有空間則是每個任務格子的資料和程式碼。全域性空間用全域性描述符表GDT來指定,區域性空間由每個任務私有的區域性描述符表LDT來指定。同GDT有GDTR來指定位置一樣,LDT和TSS分別有LDTR和TR。不同的是,後二者指定的是當前任務的資訊。

       LDT和TSS分別能提供一個任務的什麼資訊呢?LDT中存的描述符,可以描述一個任務的私有空間的段的各種資訊。TSS存放一個任務的現場資訊,用於任務切換。LDT中的描述符屬於連續儲存,而TSS之間是連結串列的形式。

       再來說說TCB。TCB:任務控制塊Task Control Block。這是核心為每個任務開設的一塊記憶體區域,裡面包括了一個任務幾乎所有的資訊。具體結構看圖,它也是以連結串列形式儲存。

            

       現在暫停一下關於任務的內容,來看看特權級保護的內容。特權級保護的內容我第一次看的時候感覺真挺複雜,但是毋庸置疑的是這部分內容很重要,所以建議多花時間去消化理解。

       特權級Prrivilege Level,是存在於描述符以及其選擇子總的一個數值,當這些描述符或者選擇子所指向的物件要進行某種操作,或者被別的物件訪問時,該數值用於控制它們所能進行的操作,或者限制它們的可訪問性。注意理解上面這句定義,它的作用是雙向的,當一個任務的一個程式碼段要訪問另外一個程式碼段或者是資料段時,它會對其進行限制,反過來,如果是那個被訪問的段,它會對其進行保護。Intel處理器可識別四個特權級別:

                        

       那麼特權級究竟是怎麼工作的呢?接下來引入DPL,CPL,RPL。

       DPL:Descriptor Privilege Level 描述符特權級。

       CPL:Current Privilege Level 當前特權級。

       RPL:Requested Privilege Level請求特權級。

       DPL是每個段的固有屬性。每定義一個段的時候,在它的段描述付裡都會有DPL,這是上一篇總結裡講的內容。

       CPL是指當前在執行的程式碼段的特權級。

       RPL是什麼稍後再說。

       這幾個特權級如何一起工作完成保護的功能?

       首先設想,有一個很重要的系統段A,我們當然不希望其他的應用隨便訪問它。假設有個程式碼段C。那麼如何保護A不被C侵入呢?此時CPL(數值)>DPL,所以只需規定,在訪問的時候,CPL≤DPL才能訪問就行了。

       但是這樣有點一刀切呀,如果我要用系統例程怎麼辦?這時有兩個辦法,一是呼叫依從段,二是呼叫門。此處著重介紹呼叫門。其實呼叫門的原理很簡單。一個段到底什麼特權級我們怎麼知道?通過段描述符。假設有一個系統段B,此刻我們希望C訪問B。可B的DPL比C的小,訪問不了怎麼辦?這個時候我們想辦法“偽造”一個B的描述符,把它的特權級改得特小,小到讓C能訪問為止。當我們想讓C訪問B時,就呼叫這個“偽造”的描述符就可以了。這個“偽造”的描述符就是“呼叫門”。

                    

       那麼呼叫的時候,具體用什麼指令呢?一是 jmp far,而是call far。二者區別是什麼呢?首先後者可以返回,前者不行。另外,用call far後,CPL會改變,而用jmp far後CPL不會變化。

       好的,現在該講RPL了。接著上面的假設講。我們不希望C訪問A,但允許C訪問B。那麼就會存在這種風險,當A訪問B以後,用call far,把CPL變成和A一樣了,那麼C就可以用這種方法間接訪問A。這也是絕對不允許發生的情況。如果我們有辦法知道在C訪問B之前是什麼特權級就可以防止這種情況的發生,RPL就是記錄這個特權級的。

        基本的特權級別檢查規則總結:

各種情況下要滿足的規則

1. 將控制直接轉移到非依從的程式碼段

CPL=目的碼段描述符的DPL

RPL=目的碼段描述符的DPL

2.將控制直接轉移到依從的程式碼段

CPL≥目的碼段描述符的DPL

RPL≥目的碼段描述符的DPL

3.高特權級的程式訪問低特權級的資料段

CPL≤目的碼段描述符的DPL

RPL≤目的碼段描述符的DPL

4.修改棧段時

CPL=目的碼段描述符的DPL

RPL=目的碼段描述符的DPL

呼叫門的規則:

CPL≤呼叫門描述符的DPL

RPL≤呼叫門描述符的DPL

CPL≥目的碼段描述符的DPL(若是JMP FAR且目的碼是非依從的, CPL=。。。的DPL)