5.2 根模式與非根模式:硬體直接支援 VMM 的架構革命#
兩層世界:root 與 non-root#
VT-x/AMD-V 的革命,用一張圖就說清楚了:
【舊世界:軟體虛擬化】
Ring 0:VMM(hypervisor)直接住在 OS 的老家
Ring 1/3:guest 核心/應用(寄人籬下,環壓縮)
問題:guest 核心住在「別人的家」,敏感指令處處露餡
【新世界:硬體輔助】
VMX root mode(根模式):VMM 獨享,全知全能
VMX non-root mode(非根模式):guest 的 Ring 0~3 整套搬進來
規則:non-root 裡執行敏感指令 → 硬體自動 VMEXIT → root 接管
關鍵:guest 現在可以堂堂正正地跑在 Ring 0——只不過是在 non-root 世界裡的 Ring 0。它所有的敏感指令都會被硬體精準地送到 VMM 面前。教科書上那十幾條漏網之魚,一夜之間全數歸案。
VMCS:每台虛擬機的「戶籍檔案+法律條文」#
每個虛擬 CPU 對應一份 VMCS(AMD 稱 VMCB),它是整個機制的靈魂:
VMCS 三大區塊:
1. Guest 狀態區:guest 的暫存器、段暫存器、控制暫存器快照
2. Host 狀態區:VMEXIT 後 VMM 自己的暫存器從哪裡載入
3. 控制區:VMM 的「立法清單」——
· 哪些指令觸發 VMEXIT(如 CPUID、MOV CR、IO)
· 哪些事件觸發 VMEXIT(例外、中斷、NMI)
· 中斷遮罩、例外點陣圖、I/O 點陣圖的指標
· 各種計時與行為微調開關
VMM 的日常工作流於是變得極其優雅:
VMM 啟動虛擬 CPU:
填好 VMCS → 執行 VMLAUNCH
CPU 在 non-root 模式全速跑 guest ……
遇到立法清單上的事件 → 硬體自動 VMEXIT
→ CPU 載入 host 狀態,跳到 VMM 的 handler
VMM 檢查退出原因、模擬該行為 → VMRESUME 回到 guest
勝利一:程式碼量的崩塌#
對 hypervisor 開發者,這是從地獄到天堂的搬遷:
| 項目 | 軟體虛擬化(DBT) | 硬體輔助 |
|---|---|---|
| 處理敏感指令 | 翻譯器逐案改寫,工程浩大 | VMCS 立法清單一個位元 |
| guest 核心位置 | 環壓縮(Ring 1),處處特例 | 堂堂正正的 non-root Ring 0 |
| 保存/恢復 CPU 狀態 | 軟體手工全套備份 | 硬體自動,一條指令 |
| 對 x86 細節的依賴 | 極深(每個角落) | 淺(靠標準介面) |
KVM(2007 年起支援)、Xen HVM(2006 年起)能以相對小的團隊快速實現全虛擬化,硬體輔助是頭號功臣。微軟 Hyper-V(2008)更是從第一天就建立在 VT-x/AMD-V 之上——沒有硬體輔助,就沒有後來的多強並立。
勝利二:VMware 的轉身#
有趣的是,DBT 的發明者 VMware 自己,也在 ESX 3.x 之後逐步把 VT-x/AMD-V 作為預設:凡是支援硬體輔助的 CPU,就用硬體路徑;DBT 退居為舊硬體的後備。黑魔法發明者親手為黑魔法送葬——正確的工程決策是不戀戰的。
效能的清醒劑:不是萬靈丹#
硬體輔助大幅簡化了正確性,但效能上曾有一段「蜜月後的清醒」:
- VMEXIT 昂貴:一次退出/進入要數百至上千個週期。敏感操作頻繁的負載(如大量 I/O、密集系統呼叫的 guest 核心)反而可能比調校成熟的 DBT 更慢;
- 記憶體虛擬化未解:頁表虛擬化仍是軟體的痛(影子頁表的開銷依舊兇猛)——這要等 5.3 的 EPT/NPT 出場;
- 結論:硬體輔助的真正價值是正確性、簡潔性、與可維護性,效能優勢要等 EPT/NPT 補上記憶體這塊短板之後才全面確立。
歷史關聯:root/non-root 的兩層世界,本質上是 IBM System/370「監督狀態/問題狀態」的升級重演——歷史繞了一圈,用更精細的硬體回到了 1960 年代立下的原則。而剩下的最後一塊拼圖,藏在 MMU 裡。