x86 彙編/保護模式
本頁將討論 x86 處理器中真實模式和保護模式操作之間的區別。它還將討論如何進入保護模式以及如何退出保護模式。現代作業系統 (Windows、Unix、Linux、BSD 等) 都是在保護模式下執行的,因此大多數組合語言程式設計師不需要這些資訊。但是,這些資訊對於嘗試編寫核心或 引導載入程式 的人來說特別有用。
當 x86 處理器通電或復位時,它處於真實模式。在真實模式下,x86 處理器本質上就像一個非常快的 8086。只能使用處理器的基本指令集。真實模式記憶體地址空間限制為 1 MiB 可定址記憶體,每個記憶體段限制為 64 KiB。真實模式本質上是為了與 8086 和 80186 程式向後相容而提供的。
在保護模式下,x86 可以定址 4 GB 的地址空間。這可能直接對映到物理 RAM(在這種情況下,如果 RAM 小於 4 GB,則某些地址空間未使用),或者可以使用分頁在虛擬地址和物理地址之間進行任意轉換。在保護模式下,記憶體中的段可以分配保護,嘗試違反此保護會導致“一般保護”異常。
386 中的保護模式,除其他事項外,由控制暫存器控制,這些暫存器分別標記為 CR0、CR2、CR3 和 CR4。
286 中的保護模式由機器狀態字控制。
長模式由 AMD 隨著 Athlon64 處理器的出現而引入。長模式允許微處理器訪問 64 位記憶體空間並訪問 64 位長暫存器。許多 16 位和 32 位指令在長模式下不起作用(或無法正常工作)。處於真實模式的 x86-64 處理器與 16 位晶片的行為完全相同,處於保護模式的 x86-64 晶片與 32 位處理器的行為完全相同。要解鎖晶片的 64 位功能,必須將晶片切換到長模式。
控制暫存器 CR0 的最低 5 位包含 5 個標誌,這些標誌決定了系統的執行方式。此狀態暫存器有一個我們特別感興趣的標誌:“保護模式啟用”標誌 (PE)。以下是進入保護模式的一般步驟
- 建立一個有效的 GDT (全域性描述符表)
- 建立一個 6 位元組偽描述符來指向 GDT
-
- 如果將使用 分頁,請使用有效的頁表、PDBR 或 PML4 載入 CR3。
- 如果將使用 PAE(物理地址擴充套件),請設定 CR4.PAE = 1。
- 如果切換到長模式,請設定 IA32_EFER.LME = 1。
- 停用中斷 (CLI)。
- 載入一個具有空限制的 IDT 偽描述符(這可以防止在保護模式下使用真實模式 IDT)
- 設定 MSW 或 CR0 暫存器的 PE 位(如果將啟用分頁,則設定 PG 位)
- 執行遠跳轉(如果切換到長模式,即使目的碼段是 64 位程式碼段,偏移量也不能超過 32 位,因為遠跳轉指令是在相容模式下執行的)
- 使用有效的選擇器載入資料段暫存器,以防止中斷髮生時出現 GP 異常
- 使用有效的堆疊載入 SS:(E)SP
- 載入指向 IDT 的 IDT 偽描述符
- 啟用中斷。
以下部分將詳細介紹這些步驟。
要在 64 位 x86 處理器 (x86-64) 上進入長模式
- 如果啟用了分頁,請停用分頁。
- 如果 CR4.PAE 尚未設定,請設定它。
- 設定 IA32_EFER.LME = 1。
- 使用有效的 PML4 表載入 CR3。
- 啟用分頁。
- 此時,您將處於相容模式。可以執行遠跳轉以切換到長模式。但是,偏移量不能超過 32 位。
CR 暫存器的許多位僅影響保護模式下的行為。
CR0 32 位暫存器有 6 個我們感興趣的位。CR0 暫存器的低 5 位和最高位。以下是 CR0 的表示
CR0: |PG|----RESERVED----|NE|ET|TS|EM|MP|PE|
- PE
- 位 0。保護環境標誌。當設定此標誌時,系統將進入保護模式。
- MP
- 位 1。監控協處理器標誌。此標誌控制“WAIT”指令的操作。
- EM
- 位 2。模擬標誌。當設定此標誌時,協處理器指令將生成異常。
- TS
- 位 3。任務切換標誌。當處理器切換到新任務時,此標誌會自動設定。
- ET
- 位 4。擴充套件型別標誌。ET(也稱為“R”)告訴我們安裝了哪種型別的協處理器。如果 ET = 0,則安裝了 80287。如果 ET = 1,則安裝了 80387。
- NE
- 位 5。新的異常。如果此標誌未設定,FPU 異常將作為中斷到達。如果設定,則作為異常。
- PG
- 位 31。分頁標誌。當設定此標誌時,將啟用記憶體分頁。我們稍後將詳細討論。
CR2 包含一個稱為頁錯誤線性地址 (PFLA) 的值。當發生頁錯誤時,將在 CR2 中儲存嘗試訪問的地址。
CR3 的高 20 位稱為頁目錄基址暫存器 (PDBR)。PDBR 儲存頁目錄的物理地址。
CR4 包含幾個標誌,這些標誌控制處理器的增強功能。
分頁是微處理器可以執行的一項特殊工作,以使系統中可用記憶體量看起來比實際更大且更動態。在分頁系統中,一定的空間可能在硬碟驅動器 (或任何輔助儲存) 上留出,稱為交換檔案或交換分割槽。系統的虛擬記憶體是程式可以訪問的一切,例如記憶體,包括物理 RAM 和交換空間。
總的虛擬記憶體被分成塊或頁,每個頁面通常為 4096 位元組(儘管在不同的系統上這個數字可能不同)。這些頁面可以在虛擬記憶體中移動,頁面內的所有指標將透過引用全域性分頁目錄(微處理器維護)自動指向新位置。當前分頁目錄的指標儲存在 CR3 暫存器中。
當系統嘗試從分頁目錄/表中標記為“不存在”的頁面讀取時,當系統嘗試將資料寫入當前可用頁面的邊界之外時,或者當分頁系統中發生任何其他錯誤時,就會發生頁面錯誤。當發生頁面錯誤時,訪問的記憶體地址將儲存在 CR2 暫存器中。
除了真實模式、保護模式和長模式之外,x86 處理器還可以進入其他模式,用於不同的用途。
- 虛擬 8086 模式:在這種模式下,為在真實模式下執行而編寫的應用程式軟體在受保護模式的多工作業系統監控下執行。
- 系統管理模式:這種模式使處理器能夠執行系統任務,如電源管理,而不會干擾作業系統或其他軟體。