1. 程式人生 > >操作系統學習(一)、80x86保護模式內存管理

操作系統學習(一)、80x86保護模式內存管理

分享 共享棧 問題 代碼 就會 空間 階段 logs ima

整理的不好,湊合著看吧

目錄


1.內存及尋址
2.地址變換
3.分段機制
4.分頁機制
5.保護
6.去到底部

一、內存及尋址

技術分享圖片

返回目錄

二、地址變換

技術分享圖片

技術分享圖片

80X86 從 邏輯地址 到 物理地址 的轉換:第一階段是使用分段機制把程序的 邏輯地址變換成處理器可尋址的內存空間(稱為線性地址空間)中的地址。 第二階段使用分頁機制把線性地址轉換為物理地址。 在地址變換的過程中, 第一階段的分段變換機制總是使用,第二階段的分頁機制是可選的,如果沒有啟用分頁機制,那麽分段機制產生的線性地址空間就直接映射到處理器的物理地址空間上。物理地址空間定義為處理器在其總線上能夠產生的地址範圍。

返回目錄

三、分段機制

技術分享圖片

上圖的分段機制,把處理器可尋址的地址空間劃分成一些較小的稱為段的受保護的地址空間區域。 用能夠用來存放 程序代碼、數據和堆棧,或者是系統的數據結構。運行多個程序的時候,給每個程序分配各自的段,確保各個程序不會互相幹擾。 還可以對斷進行分類,對不同類型的段分配不同的權限。

系統中所有使用的段都包含在處理器的線性地址空間中。 需要定位段中的某一個字節(這個就是尋址)的時候,程序必須要提供一個邏輯地址。 邏輯地址包含 一個段選擇符 和一個偏移量 。

段選擇符是在系統中是唯一的,在段選擇符中提供了 段描述符的偏移量,段描述符是段描述符表中的一個數據結構。 每一個段都有一個段描述符,說明了 段的大小 、訪問權限、 段的特權機、 段類型 和 段的基地址(段的第一個字節在星星地址空間中的位置,也叫段地址)

邏輯地址的偏移量(即偏移地址)加上段地址就可以定位到段中某一個字節的位置。 因此 段地址 + 偏移地址 就是處理器線性地址空間中的地址(線性地址)。

線性地址和物理地址具有相同的數據結構,對於兩維的邏輯地址空間來說(為什麽是兩維? 段地址和偏移地址各算一維嗎?), 它們都是一維的。

虛擬地址(邏輯地址)空間最多只能有 16k個段(2^14= 16348個段)分為兩部分,前一半為全局地址空間,後一半為局部地址空間,每個段最長為 4GB ,這樣虛擬地址空間最大就可以達到 64TB(2^14 ? 2^32 = 2^46)。
線性地址空間和物理地址空間都是 4GB 。 如果禁用了分頁機制,那麽線性地址空間就是物理地址空間。(實地址模式就是如此的吧!)

返回目錄

四 、 分頁機制

多任務系統通常定義的線性地址空間比實際的物理內存大很多, 所以需要使用某種“虛擬化”線性地址空間的方法,即虛擬存儲技術。 虛擬存儲是一種內存管理技術,使用這種技術可以讓編程人員產生內存空間要比實際物理內存大很多的錯覺。

分頁機制支持虛擬存儲技術。使用小塊的物理內存(RAM 或 ROM)和某些外部存儲空間(如硬盤)來模擬大容量的線性地址。 把每個段劃分成相同大小(通常每頁為 4KB)的頁,操作系統維護著一個頁目錄和一些頁表,當程序要訪問線性地址空間中的某一個位置時,處理器就會根據頁目錄和頁表把線性地址轉換成一個物理地址,然後就可以在該內存位置上進行讀寫操作了。 如果當前被訪問的頁面不在物理內存中,處理器就會產生一個頁錯誤異常來中斷程序的執行,然後操作系統就可以從硬盤上把該頁面讀入物理內存中,並繼續執行被中斷的程序。如果操作系統嚴格地實現了分頁機制,那麽對於正確 執行的程序來說頁面在物理內存和硬盤之間的交換就是透明的。

分頁機制使用了大小固定的內存塊,而分段機制使用了大小可變的內存,不管在物理內存上還是在硬盤上,分頁使用固定大小的塊更為適合物理內存,分段機制使用大小可變的塊更為適合處理復雜系統的邏輯分區,可以定義與邏輯塊大小適合內存單元而不用受到固定大小的頁面的限制,每個段都可作為一個單元來處理,簡化了段的保護和共享。

返回目錄

五、 保護

80X86支持兩類保護: 任務之間的保護 和 特權級保護。

1. 任務之間的保護:給每個任務不同的邏輯地址空間來完全隔離各個任務,通過把每個任務的邏輯地址映射到不同的物理地址來實現 。
把每個任務放在不同的虛擬地址空間中,並對每個任務設置不同的 邏輯地址到物理地址變換映射的方式,一個任務的邏輯地址被映射到物理內存的一部分區域,另一個任務的邏輯地址又被映射到物理內存的另一個區域。 一個任務的邏輯地址不會映射到 其它任務的邏輯地址 所映射的那一片物理內存區域,這樣所有的任務都被隔絕開了。 只需要給每個任務各自獨立的映射表,每個任務就會有不同的地址變換函數。在80X86中,每個任務都有自己的段表和頁表,當處理器切換去執行一個新的任務時,任務切換的關鍵就是切換到新任務的變換表。

在所有任務中安排相同的虛擬地址到物理地址映射部分,並且把操作系統存儲在這個公共的虛擬地址空間部分,就實現了操作系統可以被所有任務共享。這個被所有任務都具有的 相同虛擬地址空間部分叫做全局地址空間。這也是現代Linux操作系統使用虛擬地址空間的部分。

每個任務唯一的虛擬地址空間叫做局部地址空間 。局部地址空間含有需要與系統中其它任務區別開的私有的代碼和數據。由於每個任務具有不同的局部地址空間,因此兩個不同的任務對相同虛擬地址處的引用將轉換到不同的物理地址。 這就是操作系統可以給 每個任務相同的虛擬地址,但仍然能隔絕每個任務。 另一方面,所有任務在全局地址空間中對相同虛擬地址的的引用將被轉換到同一個物理地址,這就給公共代碼和數據(如操作系統)的共享提供了支持。

  1. 特權級保護
    在一個任務中,定義了 4 個執行特權級,用來 依據段中含有的數據的敏感度 和 任務中不同程序部分的 受信程度,來限制對任務中各段的訪問。最敏感的數據被賦予最高特權級,它們只能被任務中最受信任的部分訪問。不太敏感的數據被賦予較低的特權級,它們可以被任務中較低特權級的代碼訪問。

特權級用數字 0 到 3 表示, 0 具有最高特權級,而 3 則是最低特權級。每個內存段都與一個特權級相關聯。 這個特權級限制了只有具有足夠特權級的程序才能訪問這個段。 處理器從 CS 寄存器指定的段中取得和執行指令,當前特權級即CPL 就是當前活動代碼段的特權級,它定義了當前所執行程序的特權級別,確定了哪些段能夠被程序訪問。

每當程序企圖訪問一個段時,當前特權級就會與段的特權級進行比較,以確定是否有訪問許可。 在給定的 CPL 級別上執行的程序 能夠訪問同級別或低級別的數據段, 任何對高級別段的引用都是非法的,並且會引發一個異常來通知操作系統。 每個特權級都有自己的程序棧,以避免使用共享棧帶來的保護問題。當程序從一個特權級切換到另一個特權級上執行時,堆棧段也隨著改變到新級別的堆棧中。

返回目錄

操作系統學習(一)、80x86保護模式內存管理