超管理器(hypervisor)
/ HY-per-vy-zer /
如果機器虛擬化是一場魔術表演,那麼超管理器就是後台那位讓一切順利運作的舞台監督。它是一塊軟體,負責建立虛擬機、決定此刻哪一台拿到真 CPU、擁有真實記憶體並把它分配出去,並隨時準備攔截客體做出的、任何可能影響真硬體或鄰居的動作。它較早、較精確的名字叫虛擬機監視器(VMM);hypervisor 是同一件事的通俗叫法。
具體來說,超管理器運行在比它所托管的任何作業系統都更高的特權層級。把特權想成一圈圈的環:普通程式跑在最不受信任的環裡,作業系統核心跑在較受信任的環裡,而超管理器坐在連客體核心都還在其下的更高一環。所以當某個客體核心——它自以為是機器上最有權力的軟體——執行一條敏感指令時,底下的超管理器便能逮住這個嘗試、檢查它、並在虛擬硬體上模擬出原本要的效果,整個過程客體都不會察覺。它像作業系統排程行程那樣把客體排進排出,並向每個客體呈現一套一致的「獨享硬體」假象。
要分清楚的誠實區別是:超管理器虛擬化的是「機器」(CPU、記憶體、裝置),因此每個客體都帶著自己的核心;而作業系統核心虛擬化的是一台機器上的「行程」。它們解的是同一個大問題——安全地共用硬體——只是差了一個層級。現代的超管理器大量倚賴 CPU 的硬體支援(VT-x 與 AMD-V 這些功能)讓攔截變便宜;若沒有這種支援,x86 上的超管理器必須玩一套精心設計的把戲,這正是 trap-and-emulate 與 Popek-Goldberg 要求背後的整個故事。
KVM 把 Linux 核心本身變成一個超管理器:一個普通的 Linux 行程開啟 /dev/kvm,請核心建立一顆虛擬 CPU,把客體核心載入客體的記憶體,然後透過呼叫一個 ioctl(意思是「進入客體,直到它做出某件我必須處理的事為止」)來執行客體。
有了 KVM,主機自己的核心便扮演了超管理器的角色。
超管理器與虛擬機監視器(VMM)是同一件事。別把超管理器跟主機作業系統搞混;在托管式(type-2)架構中它們是不同的層,而在裸機式(type-1)架構中超管理器實際上就是最底層的作業系統。