自從2023年推出第乙個微處理器以來,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可以使用分段機制和分頁機制。 分段機制下使用的位址就是邏輯位址,形式為:段選擇子:偏移 分頁機制下使用的位址就是線性位址,形式為:0********* 無論是邏輯位址還是線性位址,都要被cpu對映成實體地址。 保護模式下必須採用分段機制。在此基礎上可採用分頁機制。 邏輯位址被轉化為線性位址,如果採用分頁機制,則該線性位址通過分頁機制被對映成實體地址。如果不採用分頁機制,則該線性位址就是實體地址。 實模式下的實體地址只能訪問1m以下空間,而保護模式下的實體地址可以訪問所有32位空間。並且要注意,物理記憶體空間只是實體地址空間的乙個部分而已。
C 什麼是實模式和保護模式
早期的作業系統的對程序的處理模式屬於實模式,即程式的執行需要記憶體,而實模式就是將程式直接載入到記憶體當中。假如此時同時有個程序b也被載入到記憶體中,即 但如果這個程序b為惡意程式或者病毒。如果程序b使用指標加偏移的方式來隨意的跳轉,例如跳轉到程序a的記憶體空間,那麼此時程序b就可以隨意的修改程序a...
進入保護模式
本文為 每個描述符佔8位元組,下圖中,上面位高32位,下面為低32位 disk boot ata channel 0 first hd cd on channel 0 type of disk image這個選項是vpc,我用2.6.2配置時選vpc無法啟動,得選flat才可以,2.6.0貌似選vp...
進入保護模式
以下圖2,圖4和圖5截自intel手冊 每個描述符佔8位元組,下圖中,上面位高32位,下面為低32位 disk boot ata channel 0 first hd cd on channel 0 type of disk image這個選項是vpc,我用2.6.2配置時選vpc無法啟動,得選fl...