跳轉到

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 裡。