這個系列文章主要目的是為了記錄我個人學習保護模式后的總結與一點點的思考。我也是一個學習者,其中由錯誤在所難免,若各位朋友指出將不勝感激。
1. Intel CPU的運行模式概述
這里我將粗略介紹Intel IA-32 CPU和其64擴展所提供的運行模式,及各運行模式的特點。
Intel IA-32架構一共提供了四種運行模式、分別是保護模式(protected mode)、實地址模式(實模式,Real-address mode)、系統管理模式(SMM)、虛擬8086模式(Virtual-8086 mode)。
其中保護模式是幾乎所有運行在現代x86 CPU上操作系統使用的模式,具備x86 CPU所有的架構特性、最佳的性能、所有的指令支持、最佳的向后兼容性,也是現代x86 CPU的原生運行模式。x86 CPU通常對所有操作系統都推薦使用該模式。
實地址模式在現代計算機中的職責通常是負責計算機開啟啟動時計算機操作系統運行環境的准備。開機啟動時CPU 首先進入實模式 讀取BIOS進行基本的硬件自檢查、硬盤扇區引導、操作系統選擇和加載等等,待操作系統加載至內存接管CPU等硬件資源時,CPU將根據操作系統期望的運行模式進行切換,通常會切換至保護模式。
虛擬8086模式是一種開啟保護模式后,為向后兼容8086程序所提供的一種准模式。注意虛擬8086模式與保護模式的關系通常是寄生關系,一般而言開啟保護模式才能在保護模式中運行虛擬8086模式,但進入SMM時情況將會有所不同。
當操作系統運行時,CPU接受操作系統的調度,但若這個過程中CPU自身出現缺陷和不可修復的錯誤怎么辦?X86 CPU提供了一種最高權限模式,系統管理模式。當CPU接收到SMM中斷時,將會切換至SMM,並且在BOIS中尋找可能修正CPU錯誤的方法,隨后再切換至合適的運算模式(可以切換至任何運行模式)。
以上是X86 IA-32架構闡述,但現代CPU和操心系統基本都運行在64位環境下,6並且4位已經成為主流,因此下面將介紹一個X86為應對64位機時代對64位做的拓展所新增的一個運行模式,IA-32e Mode(IA-32 extra mode),現代64位操作系統基本運行在該模式。該模式提供了2種子模式,兼容模式和64位模式。兼容模式提供對保護模式幾乎所有特性的接納,而64位模式則將保護模式的線性地址擴展至64位,提供了超過64GB的內存尋址空間,由此可見IA-32e模式基本可以看作是對保護模式的擴展(這也是IA-32e這種e的含義,extra),但也兼容了32位程序的運行環境。
通過上述,無論是IA-32還是其64位擴展,基本都是圍繞保護模式所展開的,而現代操作系統也可以簡單說基本都是運行在保護模式下(IA-32e模式本質上是對32位保護模式的擴展)。因此想要理解現代操作系統,保護模式必然是一道繞不過的坎。
2.保護模式概述
保護模式的重要性於Intel 白皮書中所占的篇幅即可窺探一二。這個小節將介紹在X86架構中舉足輕重的存在,力圖理清保護模式的特性。
在保護模式為出來之前,也即16位機時代,基本所有的CPU都是運行在實地址模式下。實地址模式中線性地址即可等同於物理地址,對線性地址內存的修改則直接等同與對物理地址的修改,這個所謂的實地址指的就是這個特點,線性地址等效於物理地址。這種模式有沒有問題?當然有,而且問題很大,否則為什么要有保護模式呢?實模式的主要問題其實就是出在實地址這三個字上,一切的問題都是由實地址所帶來的。
首當其沖的問題,實地址模式直面物理內存,導致CPU對所有內存一視同仁,這種做帶來的后果是CPU無法區分代碼和數據,那么代碼所在內存和數據所在內存的特點都一樣,因此所有的內存都是可讀可寫可執行的,這個問題對於系統穩定的影響和系統的危險性不言而喻,其后一切的問題基本都因此所帶來的。而后面誕生的所謂保護模式,保護的是什么?保護就是物理內存,因此保護模式最為重要的兩個特性就是段的機制和頁的機制,它們的主要目的都是為了更加安全和高效的使用物理內存,那么保護模式后面的虛擬內存、分頁映射和權限檢查等重要特性的目的將不難理解。
因此后續的文章將圍繞保護模式段和頁的機制作為主線展開,將保護模式瑣碎的細節串聯起來。