保護功能 80386的保護功能包括:存儲器的保護、特權級的保護和任務之間的保護。存儲器保護功能用來禁止程序對存儲器的非法操作,如向代碼段進行寫入、訪問段邊界以外的位置等;特權級保護功能主要保護操作系統的數據不被應用程序修改;任務之間的保護功能主要是將任務之間隔離開來。 1.存儲器的保護功能 當程序需要訪問存儲器時,一般要分為兩個階段:第一個階段是選擇段,即通過給段寄存器的段選擇器字段賦值,以選擇一個段描述符,從而選取一個段(例如:指令MOV FS,AX);第二個階段是訪問該段中的某個存儲單元(例如:指令MOV FS:IOTA,AH)。80386在這兩個階段都具有存儲器保護功能。 1)修改段寄存器時的保護 隨著程序的執行,往往要對段寄存器進行修改。80386在變更段寄存器時要進行兩方面的檢查: (1)索引號檢查 即對送往段選擇器的代入值的高13位(索引號)進行檢查應滿足: ·索引號×8+7<=描述符表的邊界,即所要訪問的描述符(8個字節)應全部位于 描述符表中。 ·對于送入CS和ss選擇器的值,必須是0以外的數據(對于DS、ES、FS和GS,送入選擇器的值可以是O)。 (2)訪問權檢查 在索引號檢查正確的情況下,可以訪問描述符表,但CPU還需對將被加載的描述符中的訪問權進行檢查。段描述符的屬性中有4位: ·DT位:為1表示存儲器的段描述符;為0表示系統的段描述符或門描述符。 ·E位:為1表示代碼段;為0表示數據段。 ·W位:僅適用于數據段。為1表示該數據段可寫入;為0表示該數據段不可寫入。 ·R位:僅適用于代碼段。為1表示可讀取;為0表示不可讀取,只能執行。 假定指令MOV FS,AX對應的段描述符的屬性分別是以下兩種情況:DT=1,E=0,W=0(禁止寫的數據段)和DT=1,E=1,R=0(禁止讀取的代碼段)。 那麼,對于第一種情況,該指令可以執行(當然,此後對該數據段不能進行寫操作);而對于第二種情況,該指令不能執行,因為代碼段的描述符只能加載到CS。 除了進行上述段的類型檢查外,最後還要檢查屬性的P位。若P=0,則表示所描述的段不存在于物理存儲器中,80386發生異常中斷(13),中斷服務程序把描述符所描述的段從輔存調入主存,然後修改P位。 2)對虛擬地址進行轉換時的保護 當修改完段寄存器之後,對段的某個存儲單元進行訪問時,需要進行地址轉換,這時80386仍要進行兩方面的檢查: (1)偏移量檢查 虛擬地址的偏移量應在段描述符的段長限規定的範圍內。 (2)訪問權檢查 按照段的屬性,也有禁止對段訪問的情況,因此還要進行段的訪問權檢查。 例:如果段的屬性中E=0,W=0(不可寫入的數據段),則指令MOV FS,AX可以執行,而指令MOV FS:BETA,BX不可執行(因為該段不可寫入)。 以上介紹的存儲器的保護功能是以段為單位的。在啟動頁功能時,頁也有保護功能,頁目錄項和頁表項的屬性字段中都有R/W(Read/Write)位和U/S(User/Supervisor)位。這兩位分別用于某個頁表所對應的1 024個頁面和某個頁面的保護功能,但這種保護功能不分配給特權級0、1和2的任務,因為其訪問權由段描述符的訪問權字節決定。表7.1l表示了特權級3的任務對頁的訪問權。

由上表可知,u/s位為0時,不管R/w位如何,特權級3的任務都不能對這個頁進行訪問。 當頁目錄項和頁表項指定的保護特性不一致時,按照條件嚴格的訪問權執行。例如,頁表項對某頁的訪問權設置為:U/S=1,R/W=1,即該頁可以讀出或寫入,而包含該頁的頁目錄項的訪問權設置為:u/s=1,R/W=0,即該頁(及該頁目錄項所對應的其他頁)只能讀。 這時,該頁的訪問權按頁目錄項的規定執行,即對該頁只能進行讀出。 同樣,當由段的保護功能和頁的保護功能所確定的訪問權發生矛盾時,按照條件嚴格的訪問權執行。 由于80386具有存儲器保護動能,所以可以避免出現下述非法操作: ·向禁止寫入的數據段(或頁)寫入數據; ·向禁止讀出的代碼段把指令當作數據讀出(可使程序代碼保密); ·修改代碼段的內容; ·把數據段的內容當做指令加以執行(不允許數據段的描述符加載到CS中); (而對8086來說,在程序轉移地址出錯時可能出現這種情況) ·訪問段以外的區域。 當存儲器的保護功能檢查發現不滿足所需條件時,80386會產生故障中斷,進入相應的中斷處理程序。 2.特權級的保護功能 前面已多次提到80386支持多任務。為了提供任務保護機制,80386將任務分成4個等級,稱為特權級,分別是0、1、2和3級;0級優先級最高,3級最低。一般,操作系統設置成0級,應用程序設置成3級,1、2級可以保留也可以使用,如把1級分配給對操作系統的擴充。 每一個任務都要用到一些段,如代碼段、數據段、堆棧段等,因此任務的特權級實際體現在所用段的屬性上。這可從前面的段描述符中看到。 先看幾個與特權級有關的名稱: ·DPL(Descriptor Privilege Level):段描述符第5個字節的第6、5位,表示段的特權級; ·CPL(Current Privilege Level):當前代碼段的特權級; ·RPL(Request Privilege Level):段選擇器字段的第1、0位,請求特權級。 當任務要啟用一個新段時,例如要通過DS啟用一個新段,需要用指令將一個16位的段選擇器代入值送入DS的選擇器字段,以替代原先DS選擇器字段的值(見圖7.37)。這個送入操作,除了進行前面所介紹的段的存儲器保護功能檢查外,還要進行特權級檢查。準備送入的新值的第1、0位,為請求特權級RPL。一般情況下,RPL等于CPL(這是因為所要使用的段是當前代碼段中的指令所指定的),但RPL和CPL也有不等的情況。將二者中級別較低的,即RLP、CPL中數值較大的特權級表示為MAX(CPL,RPL)。

上面提到的特權級檢查實際是檢查是否滿足下式: MAX(CPL,RPL)<=DPL(其中DPL為欲調用的段的特權級) 一般情況下RPL=CPL,因此上述又可表示為CPL<=DPL。 注意 到特權級的數值小所代表的級別高,所以上面的檢查實際是說明代碼段的特權級必須比要訪問的數據段的級別高或相等。 80386對修改ES、FS和GS時的特權級檢查與修改DS時的檢查相似。此外,修改CS、SS 時也要進行相應的特權級檢查。 80386利用特權級保護功能可以實現以下幾點: ·不能從特權級高的代碼段向級別低的代碼段轉移控制。例如,不能由操作系統調用用戶程序。 ·特權級低的代碼段不能訪問特權級高的數據段。例如,用戶程序不能訪問操作系統的數據段。 ·可以從特權級低的代碼段向特權級高的代碼段轉移控制,但這時堆棧段要進行相應轉換,以保持和代碼段的特權級相同。如果代碼段的特權級發生變化,堆棧段的特權級也應發生變化。 3.任務之間的保護 任務的特權級機制實際上也給任務提供了保護,例如,特權級低的代碼段不能訪問特權級高的數據段。此外,任務之間的保護還體現在每個任務有自己獨有的LDT和局部虛擬地址空間,這樣可使任務在存儲器使用區域上相互隔離,見圖7.38。

|