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.虛擬存儲器概念
虛擬存儲器是一種設計技術,用於提供比在計算機系統中實際可以使用的物理主存儲器大得多的存儲空間。使用者會產生一種錯覺,好象在程序中可以使用非常大的物理存儲空間。使用虛擬存儲器的好處是:一個程序可以很容易地在物理存儲器容量大不一樣的、配置范圍很廣的計算機上運行;編程人員使用虛擬存儲器可以寫出比任何實際配置的物理存儲器都大得多的程序。虛擬存儲器由存儲管理機制及一個大容量的快速硬盤存儲器支持。在程序運行的任何時刻,只把虛擬地址空間的一小部分映射到主存儲器,其余部分則存儲在磁盤上。因為只有存儲在主存儲器中的部分虛擬存儲器可由處理器使用,這種虛擬存儲技術將依賴程序內部訪問存儲器的局部化特性,在程序執行中只需整個虛擬存儲器中的少量存儲內容在主存儲器中駐留。而當訪問存儲器的范圍發生變化時,有必要把虛擬存儲器的某些部分從磁盤調入主存儲器,虛擬存儲器的另外的部分,也能從主存儲器傳送回磁盤上。
地址轉換機制以兩種方式支持虛擬存儲器。
第一,把實際駐留在主存儲器中的那部分虛擬存儲器標記為無效,並建立起虛擬存儲器駐留部分的虛擬-- 物理映射關系,把駐留部分的相應虛擬存儲器地址,轉換為對應物理存儲器的地址。如果程序訪問的虛擬地址對應於虛擬存儲器未駐留的部分,將由於無效映射信息而引起異常。操作系統通過把未駐留部分從磁盤上讀入到主存儲器中,來處理這種異常,並根據需要更新地址轉換表。在引起異常的原因排除以後,異常處理程序完成異常事件的處理,並返回原來的程序恢復執行。在後面的文章中將會看到,從異常處理程序返回後,這時要重新執行一次原來引起異常的指令,而該指令在後一次執行時自然會成功地完成。
第二,地址轉換機制通過收集駐留在主存儲器中的虛擬存儲器部分的使用統計信息來支持虛擬存儲器,這些使用統計信息,在主存儲器空間緊缺時,幫助操作系統決定可以將哪些部分傳送回磁盤。