天天看點

Linux作業系統基礎(三)保護模式記憶體管理(1)保護模式記憶體管理

Linux作業系統基礎(三)保護模式記憶體管理(1)

轉載請注明出處:http://blog.csdn.net/rosetta

保護模式記憶體管理

    本節描述IA-32架構保護模式下記憶體管理機制,包括段機制和頁機制。

記憶體管理簡介

         IA-32架構記憶體管理機制分兩部分:分段機制和分頁機制。分段機制使代碼段、資料段和堆棧段互相獨立,這樣多任務才可以在一個處理器上運作還不會被其它程式幹擾。分頁機制為傳統需求頁、虛拟記憶體系統提供了實作機制。其中虛拟記憶體系統用于實作程式代碼按需映射到實體記憶體中。分頁也使多任務之前相關隔離。在保護模式下,分段機制是必須實作的,沒有模式位用來關鍵分段;但是分頁機制是可選的。

         這兩種機制可以支援單任務系統、多任務系統或者支援共享記憶體的多處理器系統。如圖6所示,分段制機制提供處理器可尋址記憶體空間(線性位址)到段位址空間的位址變換。段可用來存放資料、代碼、堆棧以及系統資料結構TSS和LDT。假如一個處理器上有多個任務(程式)同時運作,那麼每個任務都有自己段集。然後處理器可以加強這些段之前的界線,并且確定一個程式不會通過寫入另一個程式的段而幹擾程式的執行。段機制對段進行了分類,這樣對特别類型的段的通路能夠受限制。

         一個系統中的所有段都在處理器的線性位址空間中。為了定位段中的一個位元組,必須提供邏輯位址(logical address,也叫遠指針)。一個邏輯位址由段選擇符和偏移值組成。段選擇符唯一标志一個段,除此之外,段選擇符還提供描述符表(比如GDT)中稱為段描述符的資料結構的偏移位址。每一個段都有一個段描述符,它用來指定段的大小,通路權限,段的特權級,段類型和線性位址空間中的段基位址。邏輯位址中的偏移位址加上段基位址就可以定位段中的一個位元組。是以基位址加上偏移位址就形成了處理器線性位址空間中的線性位址(linear address)。

         假如沒有啟用分頁,那麼處理器的線性位址就直接映射到實體位址空間。實體位址空間的大小範圍由處理器的資料總線位數決定。

         因為多任務系統定義的線性位址空間通常比實際實體記憶體大,是以需要某種虛拟化線性位址空間的方法。虛拟化線性位址空間就是通過處理器的分頁機制實作的。

         分頁支援的虛拟記憶體環境,需要由小塊的實體記憶體(RAN或ROM)和一些硬碟存儲媒體來模拟大容量的線性位址空間。當使用分頁時,每個段被分成很多頁(典型的頁大小為4KB),頁存儲在實體記憶體或者硬碟中。作業系統通過維護一個頁目錄和一組頁表集來跟蹤頁。當一個程式嘗試通路線性位址空間中的位址時,處理器通過頁目錄和頁表把線性位址空間轉換到實體位址空間中,然後在實體記憶體位置完成相應的操作請求(讀或寫)。

         假如被通路的頁不在目前實體記憶體中,那麼處理器将中斷目前程式執行(通過産生頁錯誤異常),然後作業系統或執行指令從硬碟讀取頁到實體記憶體中并繼續執行目前中斷的程式。

         當作業系統正确的完成分頁時,硬碟和實體記憶體的交換對于程式正确的執行是透明的。

段的使用

         IA-32架構支援的段機制可以使用在多種系統設計中。從最小的平坦模型僅僅使用分段保護程式到多段模型利用段創造壯健的操作環境進而使多任務程式可靠的執行。

         以下幾節将給出一些例子用于說明系統是如何利用段來提高記憶體管理的性能和可靠性。

Linux作業系統基礎(三)保護模式記憶體管理(1)保護模式記憶體管理

圖6 分段和分頁

基本的平坦模型

         系統最簡單的記憶體模型稱為“基本平坦模型”,這種模型下作業系統和應用程式都可以通路連續的、不分段的位址空間。對于系統設計者和應用程式開發者來說最大限度的隐藏了分段機制。

         為了實作記憶體基本平坦模型,至少需要兩個段描述符,一個用來指向代碼段,另一個指向資料段,如圖7所示。這兩個段都映射到整個線性位址空間:也就是說,兩個段描述符都有同樣的基位址為0和同樣的段限長4GBytes。通過設定4GBytes的段限長,當通路超過出了段限長分段機制也不會産生異常,甚至所通路的位址并沒有實體記憶體。ROM(EPROM)通常過被放在實體記憶體最高位址處,因為處理器一開始執行FFFFFFF0H處RAM(DRAM)被放在位址空間最低處,因為在系統複位後DS資料段基位址被初始化為0。

保護模式平坦模型

         保護模式平坦模型和基本平坦模型類似,隻不過段限長的範圍設定成實際實體記憶體大小。

當通路實際不存在的實體位址空間時會生成一個普通的保護異常,如圖8所示。這種模型提供了最低級别的硬體保護來通路一些程式bug。

         這種保護模型平坦模型可以變得更複雜來提供更多保護。例如,為了分頁機制中提供普通使用者和超級使用者的代碼和資料,必須定義四個段:普通使用者特權級為3的代碼和資料段,超級使用者特權級為0的代碼和資料段。通常這些段互相重疊并且從線性位址0開始。這種平坦分段模型加上一個簡單的分頁結構就可以在應用程式和作業系統之間起保護作用,如果為每個任務增加一個單獨的頁結構,那麼就可以給應用程式之前提供保護了。同樣的設計被用于一些流行的多任務作業系統。

Linux作業系統基礎(三)保護模式記憶體管理(1)保護模式記憶體管理

圖7 基本平坦模型

Linux作業系統基礎(三)保護模式記憶體管理(1)保護模式記憶體管理

圖8 保護模式平坦模型

多段模型

         一個多段模型,如圖9所示,充分發揮了段機制的對代碼、資料結構和程式提供硬體保護的能力。每個程式都有自己的段描述符表和自己的段。段可以完全屬于程式私有也可以和其它程式之前共享。

         通路權限的檢查不僅僅用來保護位址越界,也可以保護某一特定段不允許操作。例如代碼段是隻讀段,硬體可以阻擊向代碼段進行寫操作。為段建立的通路權限資訊也可以用來建議保護級别。保護級别可以用來防止未認證的應用層程式通路作業系統程式。

分頁和分段

         分頁可以用于以上描述的圖7,圖8,圖9分段模型。處理器的分頁機制把線性位址空間分為許多頁(那些段映射的地方),如圖6所示。這些線性位址空間中的頁然後映射到實體記憶體位址空間。分頁機制提供一些頁級别保護功能,它可以和段保護功能一起使用或者直接代替段保護功能。例如,它可以讓讀寫保護強制使用到基礎page-by-page(?)。頁機制也提供兩級别保護(普通使用者和超級使用者),這也在基礎page-by-page中指定。

Linux作業系統基礎(三)保護模式記憶體管理(1)保護模式記憶體管理

圖9 多段模型

 參考:《Intel SystemProgramming Guide》

          《Linux核心完全剖析》趙炯編著

繼續閱讀