什麼是保護模式

自從1969年推出第一個微處理器以來,Intel處理器就在不斷地更新換代,從8086、8088、80286,到80386、80486、奔騰、奔騰Ⅱ、奔騰4等,其體系結構也在不斷變化。80386以後,提供了一些新的功能,彌補了8086的一些缺陷。這其中包括內存保護、多任務及使用640KB以上的內存等,並仍然保持和8086家族的兼容性。也就是說80386仍然具備了8086和80286的所有功能,但是在功能上有了很大的增強。早期的處理器是工作在實模式之下的,80286以後引入了保護模式,而在80386以後保護模式又進行了很大的改進。在80386中,保護模式爲程序員提供了更好的保護,提供了更多的內存。事實上,保護模式的目的不是爲了保護程序,而是要保護程序以外的所有程序(包括操作系統)。

簡言之,保護模式是處理器的一種最自然的模式。在這種模式下,處理器的所有指令及體系結構的所有特色都是可用的,並且能夠達到最高的性能。

保護模式和實模式

從表面上看,保護模式和實模式並沒有太大的區別,二者都使用了內存段、中斷和設備驅動來處理硬件,但二者有很多不同之處。我們知道,在實模式中內存被劃分成段,每個段的大小爲64KB,而這樣的段地址可以用16位來表示。內存段的處理是通過和段寄存器相關聯的內部機制來處理的,這些段寄存器(CS、DS、SS和ES)的內容形成了物理地址的一部分。具體來說,最終的物理地址是由16位的段地址和16位的段內偏移地址組成的。用公式表示爲:

物理地址=左移4位的段地址+偏移地址。

在保護模式下,段是通過一系列被稱之爲"描述符表"的表所定義的。段寄存器存儲的是指向這些表的指針。用於定義內存段的表有兩種:全局描述符表(GDT)和局部描述符表(LDT)。GDT是一個段描述符數組,其中包含所有應用程序都可以使用的基本描述符。在實模式中,段長是固定的(爲64KB),而在保護模式中,段長是可變的,其最大可達4GB。LDT也是段描述符的一個數組。與GDT不同,LDT是一個段,其中存放的是局部的、不需要全局共享的段描述符。每一個操作系統都必須定義一個GDT,而每一個正在運行的任務都會有一個相應的LDT。每一個描述符的長度是8個字節,格式如圖3所示。當段寄存器被加載的時候,段基地址就會從相應的表入口獲得。描述符的內容會被存儲在一個程序員不可見的影像寄存器(shadow register)之中,以便下一次同一個段可以使用該信息而不用每次都到表中提取。物理地址由16位或者32位的偏移加上影像寄存器中的基址組成。實模式和保護模式的不同可以從圖1和圖2中很清楚地看出來。

此外,還有一箇中斷描述符表(IDT)。這些中斷描述符會告訴處理器到那裏可以找到中斷處理程序。和實模式一樣,每一箇中斷都有一個入口,但是這些入口的格式卻完全不同。因爲在切換到保護模式的過程中沒有使用到IDT,所以在此就不多做介紹了。

進入保護模式

80386有4個32位控制寄存器,名字分別爲CR0、CR1、CR2和CR3。CR1是保留在未來處理器中使用的,在80386中沒有定義。CR0包含系統的控制標誌,用於控制處理器的操作模式和狀態。CR2和CR3是用於控制分頁機制的。在此,我們關注的是CR0寄存器的PE位控制,它負責實模式和保護模式之間的切換。當PE=1時,說明處理器運行於保護模式之下,其採用的段機制和前面所述的相應內容對應。如果PE=0,那麼處理器就工作在實模式之下。

切換到保護模式,實際就是把PE位置爲1。爲了把系統切換到保護模式,還要做一些其它的事情。程序必須要對系統的段寄存器和控制寄存器進行初始化。把PE位置1後,還要執行跳轉指令。過程簡述如下:

1.創建GDT表;

2.通過置PE位爲1進入保護模式;

3.執行跳轉以清除在實模式下讀取的任何指令。
實模式下,cpu指令訪問的地址就是物理地址,形式爲:段寄存器:偏移 在保護模式下,cpu可以使用分段機制和分頁機制。 分段機制下使用的地址就是邏輯地址,形式爲:段選擇子:偏移 分頁機制下使用的地址就是線性地址,形式爲:0xXXXXXXXX 無論是邏輯地址還是線性地址,都要被cpu映射成物理地址。 保護模式下必須採用分段機制。在此基礎上可採用分頁機制。 邏輯地址被轉化爲線性地址,如果採用分頁機制,則該線性地址通過分頁機制被映射成物理地址。如果不採用分頁機制,則該線性地址就是物理地址。 實模式下的物理地址只能訪問1M以下空間,而保護模式下的物理地址可以訪問所有32位空間。並且要注意,物理內存空間只是物理地址空間的一個部分而已。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章