Intel CPU的保護模式 來龍去脈


1為什么要使用cpu的保護模式呢?
  經常有不懂的人會問我這個問題,第一次我也被問住了,只是在看cpu是如何實現的,可卻從來沒有真正的跳出來思考過,cpu的保護模式帶給我們什么好處?

答:我非常總結的說一下。保護模式主要目的保護多任務之間代碼訪問的完全隔離(使用虛擬地址),單任務的用戶代碼和系統代碼的訪問格式(使用cpu的privilege環)。當然虛擬地址也給內存管理帶來了其他的好處,更細節的看下面的文章轉載。

2 為什么一定要從實模式切換到保護模式,而不是開機就是保護模式?
  最主要的原因是:兼容以前的軟件,不兼容以前的軟件就會失去市場,所以intel處理器發展到今天回如此的復雜。

+++++++++++++++++++++++++++++++++++++++++++++++++++

轉載於:http://blog.sina.com.cn/s/blog_511703010100m1yp.html

已經比較了解intel cpu保護模式的人,會覺得下面這篇文章寫得確實不錯。

Intel CPU的保護模式簡介(一)

保護模式

x86有三種工作方式:實模式,保護模式和虛擬x86模式。盡管實方式下x86的功能要大大超過其先前的處理器(8086/8088,80186,80286),但只有在保護方式下, x86才能真正發揮更大的作用。在保護方式下,全部32條地址線有效,可尋址高達4G字節的物理地址空間;擴充的存儲器分段管理機制和可選的存儲器分頁管理機制,不僅為存儲器共享和保護提供了硬件支持,而且為實現虛擬存儲器提供了硬件支持;支持多任務,能夠快速地進行任務切換和保護任務環境;4個特權級和完善的特權檢查機制,既能實現資源共享又能保證代碼和數據的安全和保密及任務的隔離;支持虛擬8086方式,便於執行8086程序。

(1)存儲管理機制

為了對存儲器中的程序及數據實現保護和共享提供硬件支持,為了對實現虛擬存儲器提供硬件支持,在保護方式下, x86不僅采用擴充的存儲器分段管理機制,而且提供可選的存儲器分頁管理機制。這些存儲管理機制由x86存儲管理部件MMU實現。

1.目標

x86有32根地址線,在保護方式下,它們都能發揮作用,所以可尋址的物理地址空間高達4G字節。在以x86及其以上處理器為CPU的PC兼容機系統中,把地址在1M以下的內存稱為常規內存,把地址在1M 以上的內存稱為擴展內存。

x86還要對實現虛擬存儲器提供支持。雖然與8086可尋址的1M字節物理地址空間相比,x86可尋址的物理地址空間可謂很大,但實際的微機系統不可能安裝如此達的物理內存。所以,為了運行大型程序和真正實現多任務,必須采用虛擬存儲器。虛擬存儲器是一種軟硬件結合的技術,用於提供比在計算機系統中實際可以使用的物理主存儲器大得多的存儲空間。這樣,程序員在編寫程序時不用考慮計算機中物理存儲器的實際容量。

x86還要對存放在存儲器中的代碼及數據的共享和保護提供支持。任務甲和任務乙並存,任務甲和任務乙必須隔離,以免相互影響。但它們又可能要共享部分代碼和數據。所以,80386既要支持任務隔離,又要支持可共享代碼和數據的共享,還要支持特權保護。

2.地址空間和地址轉換

保護方式下的虛擬存儲器由大小可變的存儲塊構成,這樣的存儲塊稱為段。x86采用稱為描述符的數據來描述段的位置、大小和使用情況。虛擬存儲器的地址(邏輯地址)由指示描述符的段選擇子和段內偏移兩部分構成,這樣的地址集合稱為虛擬地址空間。程序員編寫程序時使用的存儲地址空間是虛擬地址空間,所以,他們可認為有足夠大的存儲空間可供使用。

顯然,只有在物理存儲器中的程序才能運行,只有在物理存儲器中的數據才能訪問。 因此,虛擬地址空間必須映射到物理地址空間,二維的虛擬地址必須轉化成一維的物理地址。由於物理地址空間遠小於虛擬地址空間,所以只有虛擬地址空間中的部 分可以映射到物理地址空間。由於物理存儲器的大小要遠小於物理地址空間,所以只有上述部分中的部分才能真正映射到物理存儲器。

每一個任務有一個虛擬地址空間。為了避免多個並行任務的多個虛擬地址空間直接映射到同一個物理地址空間,采用線性地址空間隔離虛擬地址空間和物理地址空間。線性地址空間由一維的線性地址構成,線性地址空間和物理地址空間對等。線性地址32位長,線性地址空間容量為4G字節。

x86分兩步實現虛擬地址空間到物理地址空間到物理地址空間的映射,也就是分兩步實現虛擬地址到物理地址的轉換,但第二步(分管理機制)是可選的。

通過段描述符表和段描述符,分段管理機制實現虛擬地址空間到線性地址空間的映射,實現把二維的虛擬地址轉換為一維的線性地址。這一步總是存在的(分段管理機制)。

分頁管理機制把線性地址空間和物理地址空間分別划分為大小相同的塊,這樣的塊稱為頁(一般為4KB)。通過在線性地址空間的頁與物理地址空間的頁之間建立的映射表,分頁管理機制實現線性地址空間到物理地址空間的映射,實現線性地址到物理地址的轉換。分頁管理機制是可選的,在不采用分頁管理機制時,線性地址空間就等同於物理地址空間,線性地址就等於物理地址。

分段管理機制所使用的可變大小的塊,分段管理機制比較適宜處理復雜系統的邏輯分段。存儲塊的大小可以根據適當的邏輯含義進行定義,而不用考慮固定大小的頁 的人為限制。每個段可作為獨立的單位進行處理,以簡化段的保護及共享。分頁機制使用的固定大小的塊最適合於管理物理存儲器,無論是管理內存還是外存都同樣 有效。分頁管理機制能夠有效地支持實現虛擬存儲器。

段及分頁這兩種機制是兩種不同的轉換機制,是整個地址轉換函數的不同的轉換級。雖然兩種機制都利用存儲在主存儲器中的轉換表,但這些表具有獨立的結構。事實上,段表存儲在線性地址空間,而頁表存儲在物理地址空間(物 理存儲器)。段轉換機制把虛擬地址轉換為線性地址,並在線性地址中訪問段轉換機制的表格,而不會覺察分頁機制已把線性地址轉換為物理地址。類似地,分頁管 理機制只是直接地把線性地址轉換為物理地址,並且在物理地址中訪問轉換表格,並不知道虛擬地址空間的存在,甚至不知道段轉換機制的存在。

3.虛擬存儲器概念

虛擬存儲器是一種設計技術,用於提供比在計算機系統中實際可以使用的物理主存儲器大得多的存儲空間。使用者會產生一種錯覺,好象在程序中可以使用非常大的物理存儲空間。使用虛擬存儲器的好處是:一個程序可以很容易地在物理存儲器容量大不一樣的、配置范圍很廣的計算機上運行;編程人員使用虛擬存儲器可以寫出比任何實際配置的物理存儲器都大得多的程序。虛 擬存儲器由存儲管理機制及一個大容量的快速硬盤存儲器支持。在程序運行的任何時刻,只把虛擬地址空間的一小部分映射到主存儲器,其余部分則存儲在磁盤上。 因為只有存儲在主存儲器中的部分虛擬存儲器可由處理器使用,這種虛擬存儲技術將依賴程序內部訪問存儲器的局部化特性,在程序執行中只需整個虛擬存儲器中的 少量存儲內容在主存儲器中駐留。而當訪問存儲器的范圍發生變化時,有必要把虛擬存儲器的某些部分從磁盤調入主存儲器,虛擬存儲器的另外的部分,也能從主存 儲器傳送回磁盤上。

地址轉換機制以兩種方式支持虛擬存儲器。

第一,把實際駐留在主存儲器中的那部分虛擬存儲器標記為無效,並建立起虛擬存儲器駐留部分的虛擬-- 物理映射關系,把駐留部分的相應虛擬存儲器地址,轉換為對應物理存儲器的地址。如果程序訪問的虛擬地址對應於虛擬存儲器未駐留的部分,將由於無效映射信息而引起異常。操作系統通過把未駐留部分從磁盤上讀入到主存儲器中,來處理這種異常,並根據需要更新地址轉換表。在引起異常的原因排除以后,異常處理程序完成異常事件的處理,並返回原來的程序恢復執行。在后面的文章中將會看到,從異常處理程序返回后,這時要重新執行一次原來引起異常的指令,而該指令在后一次執行時自然會成功地完成。

第二,地址轉換機制通過收集駐留在主存儲器中的虛擬存儲器部分的使用統計信息來支持虛擬存儲器,這些使用統計信息,在主存儲器空間緊缺時,幫助操作系統決定可以將哪些部分傳送回磁盤。
 

Intel CPU的保護模式簡介(二)

(2)保護機制

為了支持多任務,對各任務實施保護是必需的。從80286開始,處理器就具備了保護機制。保護機制能有效地實現不同任務之間的保護和同一任務內的保護。

1.不同任務之間的保護

保護的一個重要方面是應用程序之間的保護。虛擬地址到物理地址的映射函數在每個任務中進行定義,隨着任務切換,映射函數也切換。任務A的虛擬地址空間映射到物理地址空間的某個區域,而任務B的虛擬地址空間映射到物理地址空間的另外區域,彼此獨立,互不相干。因此,兩個不同的任務,盡管虛擬存儲單元地址相同,但實際的物理存儲單元地址可以不同。

每個任務各有一組獨立的映射表,即具有不同的地址轉換函數。在x86上, 每個任務都有自己的段表及頁表。當處理器進行切換並執行新的任務時,這種任務切換的一個重要部分,就是為新任務切換任務的轉換表。為了使操作系統與所有的 應用程序相隔離,可以把操作系統存儲在一個單一的任務中。然而,我們即將看到,在一個任務內操作的保護機制,更適合於保護操作系統,使其不被應用程序破 壞。這種機制,使操作系統由所有任務共享,並且可在每一任務中對其進行訪問,而且仍然保護了操作系統,使其不被應用程序破壞。這種保護操作系統的方法,是 把操作系統存儲在虛擬地址空間的一個公共區域,然后,再使每一任務按此區域分配一個同樣的虛擬地址空間,並進行同樣的虛擬--物理地址映射。各個任務公用的這部分虛擬地址空間,被稱為全局地址空間。

僅由一個任務占有的虛擬地址空間部分,即不被任何其它任務共享的虛擬地址部分,稱為局部地址空間。局部地址空間包含的代碼和數據,是任務私有的,需要與系統中的其它任務相隔離。

每個任務中有不同的局部地址空間。因此,兩個不同的任務中,對同一虛擬地址的訪問,實際上轉換為不同的物理地址。這就使操作系統對每個任務的存儲器,可以賦予相同的虛擬地址,仍然保證任務的隔離。另一方面,對全局地址空間中同一虛擬地址的訪問,在所有任務中都轉換為同樣的物理地址,從而支持公共的代碼及數據的共享,例如對操作系統的共享。

2.同一任務內的保護

在一個任務之內,定義有四種執行特權級別,用於限制對任務中的段進行訪問。按照包含在段中的數據的重要性和代碼的可信程度,給段指定特權級別。把最高的特 權級別分配給最重要的數據段和最可信任的代碼段。具有最高特權級別的數據,只能由最可信任的代碼訪問。給不重要的數據段和一般代碼段分配較低的特權級別。 具有最低特權級別的數據,可被具有任何特權級別的代碼訪問。

特權級別用數字0、1、2和3表示,數字0表示最高特權級別,而數字3表示最低特權級別,即數字較大的級別具有較低的特權。為了避免模糊和混淆,在比較特權級別時,不使用“大於”或“小於”這樣的術語,而使用“里面”或“內層”這樣的術語表示較高特權級,級別的數字較小;使用“外面”或“外層”這樣的術語表示較低特權級別,級別的數字較大。0級為最內層的特權級別,3級為最外層的特權級別。

每一特權級都有各自獨立的程序堆棧,以避免與共享棧區有關的保護問題。當一個程序從一個特權級切換到另一個特權級執行時,程序使用的堆棧,從原特權級的棧段改變為新特權級的棧段。對於堆棧段寄存器 SS來說,描述符特權級(DPL)必須等於當前代碼段的特權級(CPL)。從一個特權級切換到另一特權級的方法將在控制轉移方法一文中描述。

每個存儲器段都與一個特權級別相聯系。特權級別限制是指,只有足夠級別的程序,才可對相應的段進行訪問。在任何時候,一個任務總是在四個特權級之一下運行,任務在特定時刻的特權級稱為當前特權級 (Current Privilege level),標記為CPL,即當前運行程序的特權級。每當一個程序試圖訪問一個段時,就把CPL與要訪問的段的特權級進行比較,以決定是否允許這一訪問。對給定CPL執行的程序,允許訪問同一級別或外層級別的數據段。

雖然應用程序都在最外層,但由於各個不同的應用程序存儲在不同的虛擬地址空間中,所以各應用程序被隔離保護。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM