程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> 匯編語言 >> 80386保護方式簡介

80386保護方式簡介

編輯:匯編語言

  80386有三種工作方式:實模式,保護模式和虛擬8086模式。本文介紹保護方式下的80386及相關的程序設計內容。實模式下的80386寄存器,尋址方式和指令等基本概念,除特別說明外在保護方式下仍然保持。
     盡管實方式下80386的功能要大大超過其先前的處理器(8086/8088,80186,80286),但只有在保護方式下, 80386才能真正發揮更大的作用。在保護方式下,全部32條地址線有效,可尋址高達4G字節的物理地址空間;擴充的存儲器分段管理機制和可選的存儲器分頁管理機制,不僅為存儲器共享和保護提供了硬件支持,而且為實現虛擬存儲器提供了硬件支持;支持多任務,能夠快速地進行任務切換和保護任務環境;4個特權級和完善的特權檢查機制,既能實現資源共享又能保證代碼和數據的安全和保密及任務的隔離;支持虛擬8086方式,便於執行8086程序。
     <一>存儲管理機制
     為了對存儲器中的程序及數據實現保護和共享提供硬件支持,為了對實現虛擬存儲器提供硬件支持,在保護方式下,80386不僅采用擴充的存儲器分段管理機制,而且提供可選的存儲器分頁管理機制。這些存儲管理機制由80386存儲管理部件MMU實現。
     1.目標
     80386有32根地址線,在保護方式下,它們都能發揮作用,所以可尋址的物理地址空間高達4G字節。在以80386及其以上處理器為CPU的PC兼容機系統中,把地址在1M以下的內存稱為常規內存,把地址在1M 以上的內存稱為擴展內存。
     80386還要對實現虛擬存儲器提供支持。雖然與8086可尋址的1M字節物理地址空間相比,80386可尋址的物理地址空間可謂很大,但實際的微機系統不可能安裝如此達的物理內存。所以,為了運行大型程序和真正實現多任務,必須采用虛擬存儲器。虛擬存儲器是一種軟硬件結合的技術,用於提供比在計算機系統中實際可以使用的物理主存儲器大得多的存儲空間。這樣,程序員在編寫程序時不用考慮計算機中物理存儲器的實際容量。
     80386還要對存放在存儲器中的代碼及數據的共享和保護提供支持。任務甲和任務乙並存,任務甲和任務乙必須隔離,以免相互影響。但它們又可能要共享部分代碼和數據。所以,80386既要支持任務隔離,又要支持可共享代碼和數據的共享,還要支持特權保護。
    2.地址空間和地址轉換
     保護方式下的虛擬存儲器由大小可變的存儲塊構成,這樣的存儲塊稱為段。80386采用稱為描述符的數據來描述段的位置、大小和使用情況。虛擬存儲器的地址(邏輯地址)由指示描述符的選擇子和段內偏移兩部分構成,這樣的地址集合稱為虛擬地址空間。80386支持的虛擬地址空間可達64T字節。程序員編寫程序時使用的存儲地址空間是虛擬地址空間,所以,他們可認為有足夠大的存儲空間可供使用。
     顯然,只有在物理存儲器中的程序才能運行,只有在物理存儲器中的數據才能訪問。因此,虛擬地址空間必須映射到物理地址空間,二維的虛擬地址必須轉化成一維的物理地址。由於物理地址空間遠小於虛擬地址空間,所以只有虛擬地址空間中的部分可以映射到物理地址空間。由於物理存儲器的大小要遠小於物理地址空間,所以只有上述部分中的部分才能真正映射到物理存儲器。
    每一個任務有一個虛擬地址空間。為了避免多個並行任務的多個虛擬地址空間直接映射到同一個物理地址空間,采用線性地址空間隔離虛擬地址空間和物理地址空間。線性地址空間由一維的線性地址構成,線性地址空間和物理地址空間對等。線性地址32位長,線性地址空間容量為4G字節。
     80386分兩步實現虛擬地址空間到物理地址空間到物理地址空間的映射,也就是分兩步實現虛擬地址到物理地址的轉換,但第二步是可選的。下圖是地址映射轉換的示意圖。
         
     通過描述符表和描述符,分段管理機制實現虛擬地址空間到線性地址空間的映射,實現把二維的虛擬地址轉換為一維的線性地址。這一步總是存在的。
     分頁管理機制把線性地址空間和物理地址空間分別劃分為大小相同的塊,這樣的塊稱為頁。通過在線性地址空間的頁與物理地址空間的頁建立之間建立的映射表,分頁管理機制實現線性地址空間到物理地址空間的映射,實現線性地址到物理地址的轉換。分頁管理機制是可選的,在不采用分頁管理機制時,線性地址空間就等同於物理地址空間,線性地址就等於物理地址。
    分段管理機制所使用的可變大小的塊,時分段管理機制比較適宜處理復雜系統的邏輯分段。存儲塊的大小可以根據適當的邏輯含義進行定義,而不用考慮固定大小的頁所強加的人為限制。每個段可作為獨立的單位處理,以簡化段的保護及共享。分頁機制使用的固定大小的塊最適合於管理物理存儲器,無論是管理內存還是外存都同樣有效。分頁管理機制能夠有效地支持實現虛擬存儲器。
     段及分頁這兩種機制是兩種不同的轉換機制,是整個地址轉換函數的不同的轉換級。雖然兩種機制都利用存儲在主存儲器中的轉換表,但這些表具有獨立的結構。事實上,段表存儲在線性地址空間,而頁表存儲在物理地址空間。因此,段轉換表可由分頁機制重新進行定位而不需段機制的參與。段轉換機制把虛擬地址轉換為線性地址,並在線性地址中訪問段轉換機制的表格,而不會覺察分頁機制已把線性地址轉換為物理地址。類似地,分頁機制對於程序產生的地址所使用的虛擬地址空間一無所知。分頁機制只是直接地把線性地址轉換為物理地址,並且在物理地址中訪問轉換表格,並不知道虛擬地址空間的存在,甚至不知道段轉換機制的存在。
     3.虛擬存儲器概念
     虛擬存儲器是一種設計技術,用於提供比在計算機系統中實際可以使用的物理主存儲器大得多的存儲空間。使用者會產生一種錯覺,好象在程序中可以使用非常大的物理存儲空間。使用虛擬存儲器的好處是:一個程序可以很容易地在物理存儲器容量大不一樣的、配置范圍很廣的計算機上運行;編程人員使用虛擬存儲器可以寫出比任何實際配置的物理存儲器都大得多的程序。虛擬存儲器由存儲管理機制及一個大容量的快速硬盤存儲器支持。在程序運行的任何時刻,只把虛擬地址空間的一小部分映射到主存儲器,其余部分則存儲在磁盤上。因為只有存儲在主存儲器中的部分虛擬存儲器可由處理器使用,這種虛擬存儲技術將依賴程序內部訪問存儲器的局部化特性,在程序執行中只需整個虛擬存儲器中的少量存儲內容在主存儲器中駐留。而當訪問存儲器的范圍發生變化時,有必要把虛擬存儲器的某些部分從磁盤調入主存儲器,虛擬存儲器的另外的部分,也能從主存儲器傳送回磁盤上。
     地址轉換機制以兩種方式支持虛擬存儲器。
     第一,把實際駐留在主存儲器中的那部分虛擬存儲器標記為無效,並建立起虛擬存儲器駐留部分的虛擬-- 物理映射關系,把駐留部分的相應虛擬存儲器地址,轉換為對應物理存儲器的地址。如果程序訪問的虛擬地址對應於虛擬存儲器未駐留的部分,將由於無效映射信息而引起異常。操作系統通過把未駐留部分從磁盤上讀入到主存儲器中,來處理這種異常,並根據需要更新地址轉換表。在引起異常的原因排除以後,異常處理程序完成異常事件的處理,並返回原來的程序恢復執行。在後面的文章中將會看到,從異常處理程序返回後,這時要重新執行一次原來引起異常的指令,而該指令在後一次執行時自然會成功地完成。
     第二,地址轉換機制通過收集駐留在主存儲器中的虛擬存儲器部分的使用統計信息來支持虛擬存儲器,這些使用統計信息,在主存儲器空間緊缺時,幫助操作系統決定可以將哪些部分傳送回磁盤。


     <二>保護機制
     為了支持多任務,對各任務實施保護是必需的。從80286開始,處理器就具備了保護機制。保護機制能有效地實現不同任務之間的保護和同一任務內的保護。
     1.不同任務之間的保護
     保護的一個重要方面是應用程序之間的保護。通過把每個任務放置在不同的虛擬地址空間的方法來實現任務與任務的隔離,達到應用程序之間保護的目的。虛擬地址到物理地址的映射函數在每個任務中進行定義,隨著任務切換,映射函數也切換。任務A的虛擬地址空間映射到物理地址空間的某個區域,而任務B的虛擬地址空間映射到物理地址空間的另外區域,彼此獨立,互不相干。因此,兩個不同的任務,盡管虛擬存儲單元地址相同,但實際的物理存儲單元地址可以不同。
     每個任務各有一組獨立的映射表,即具有不同的地址轉換函數。在80386上,每個任務都有自己的段表及頁表。當處理器進行切換並執行新的任務時,這種任務切換的一個重要部分,就是為新任務切換任務的轉換表。為了使操作系統與所有的應用程序相隔離,可以把操作系統存儲在一個單一的任務中。然而,我們即將看到,在一個任務內操作的保護機制,更適合於保護操作系統,使其不被應用程序破壞。這種機制,使操作系統由所有任務共享,並且可在每一任務中對其進行訪問,而且仍然保護了操作系統,使其不被應用程序破壞。這種保護操作系統的方法,是把操作系統存儲在虛擬地址空間的一個公共區域,然後,再使每一任務按此區域分配一個同樣的虛擬地址空間,並進行同樣的虛擬--物理地址映射。各個任務公用的這部分虛擬地址空間,被稱為全局地址空間。
     僅由一個任務占有的虛擬地址空間部分,即不被任何其它任務共享的虛擬地址部分,稱為局部地址空間。局部地址空間包含的代碼和數據,是任務私有的,需要與系統中的其它任務相隔離。
     再每個任務中有不同的局部地址空間。因此,兩個不同的任務中,對同一虛擬地址的訪問,實際上轉換為不同的物理地址。這就使操作系統對每個任務的存儲器,可以賦予相同的虛擬地址,仍然保證任務的隔離。另一方面,對全局地址空間中同一虛擬地址的訪問,在所有任務中都轉換為同樣的物理地址,從而支持公共的代碼及數據的共享,例如對操作系統的共享。
     2.同一任務內的保護
     在一個任務之內,定義有四種執行特權級別,用於限制對任務中的段進行訪問。按照包含在段中的數據的重要性和代碼的可信程度,給段指定特權級別。把最高的特權級別分配給最重要的數據段和最可信任的代碼段。具有最高特權級別的數據,只能由最可信任的代碼訪問。給不重要的數據段和一般代碼段分配較低的特權級別。具有最低特權級別的數據,可被具有任何特權級別的代碼訪問。
     特權級別用數字0、1、2和3表示,數字0表示最高特權級別,而數字3表示最低特權級別,即數字較大的級別具有較低的特權。為了避免模糊和混淆,在比較特權級別時,不使用“大於”或“小於”這樣的術語,而使用“裡面”或“內層”這樣的術語表示較高特權級,級別的數字較小;使用“外面”或“外層”這樣的術語表示較低特權級別,級別的數字較大。0級為最內層的特權級別,3級為最外層的特權級別,按這樣的表示方法,四種特權級的層次關系如下圖(圖中右邊的數字為特權級)所示。
                               
      每一特權級都有各自獨立的程序堆棧,以避免與共享棧區有關的保護問題。當一個程序從一個特權級切換到另一個特權級執行時,程序使用的堆棧,從原特權級的棧段改變為新特權級的棧段。對於堆棧段寄存器 SS來說,描述符特權級(DPL)必須等於當前代碼段的特權級(CPL)。從一個特權級切換到另一特權級的方法將在控制轉移方法一文中描述。
     每個存儲器段都與一個特權級別相聯系。特權級別限制是指,只有足夠級別的程序,才可對相應的段進行訪問。在任何時候,一個任務總是在四個特權級之一下運行,任務在特定時刻的特權級稱為當前特權級 (Current Privilege level),標記為CPL,即當前運行程序的特權級。每當一個程序試圖訪問一個段時,就把CPL與要訪問的段的特權級進行比較,以決定是否允許這一訪問。對給定CPL執行的程序,允許訪問同一級別或外層級別的數據段。如上圖所示,CodeK可訪問同級的數據段DataK,也可訪問外層的DataOS、 DataAP1及DataAP2等。如果試圖訪問內層級別的數據段則是非法的,並引起異常。如上圖所示,CodeOS可訪問同級的DataOS,也可訪問外層的DataAP1和DataAP2等,但不能訪問內層的DataK。
     雖然應用程序都在最外層,但由於各個不同的應用程序存儲在不同的虛擬地址空間中,所以各應用程序被隔離保護。如上圖所示,最外層的CodeAP1只能訪問DataAP1,不可能訪問同級的另一應用程序的DataAP2;同樣,CodeAP2只能訪問DataAP2,不可能訪問DataAP1。
     這實際上是組合保護。應用程序1和操作系統構成任務A,應用程序2和操作系統構成任務B。操作系統被任務A和任務B共享,在任務A和任務B的兩個不同的虛擬地址空間中,操作系統占用虛擬地址空間相同的部分。
    特權級的典型用法是,把操作系統的核心部分放在0級,操作系統的其余部分放在1級,而應用程序放在3 級,留下的2級供中間軟件使用。對特權級進行這樣的安排,使得在0級的操作系統核心有權訪問任務中的所有存儲段;而在3級的應用程序只能訪問程序本身的存儲段,這些存儲段也是在3級(注意,Windows 9X 操作系統只使用了0級和3級,以便於移植到精簡指令集的計算機上,如RS4000等,這些處理器一般只有兩個特權級,即系統級和用戶級)。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved