硬科技:為何x86的虛擬化這麼難搞(下)

2020.03.11 08:00AM

前情提要。現在想必各位科科對於處理器虛擬化的看法不外乎「讓作業系統變成應用程式,虛擬機管理者取代作業系統的角色,不就好了,反正還有例外處理機制可以當最後一道防線嘛」,但感謝x86指令集先天不足後天失調的發展史,使其特別難搞,因為有些使用者模式的x86指令,也是有機會「撈過界」對底層上下其手。

我們就來瞧瞧問世於1974年,用來驗證計算機架構能否有效虛擬化的方式「波佩克與戈德堡虛擬化需求」(Popek and Goldberg virtualization requirements) 是如何定義的。

  • 效率(Efficiency):機器指令中不會更動系統狀態者,應直接使用底層硬體執行,不受干預。
  • 資源控制(Resource Control):VMM(Virtual Machine Manager)完全控制虛擬資源,當作業系統嘗試更動底層系統狀態時,VMM將被主動告知,阻止該破壞系統穩定度的行為,再更換成不會造成危險的等效指令碼。
  • 等價性(Equivalence):執行在VMM上的作業系統,其行為模式完全等同執行在原生硬體上。

只要當一切會更動底層系統狀態的關鍵性(Sensitive)指令都應納入系統特權(Privileged)指令的範圍,當執行在虛擬機之上的作業系統之任何「危險行為」,都會觸動處理器的例外處理(Exception)機制與VMM的設陷(Trap),即可攔截並更替為安全的指令碼。

很不幸的,x86指令集中18個使用者模式指令與多數I/O指令並不符合上述標準。最有名的案例是POPF指令更動EFLAGS的Interupt Enable欄位,在使用者模式不會啟動,但是也不會造成例外。無論任其更動系統底層狀態,或著處理器不會執行,都不會引起例外。這些指令在單機作業系統上並不會造成問題,但卻是虛擬化的大麻煩。換言之,必須先抓出來這些「麻煩製造者」,再採用軟體模擬或二進位代碼轉換(Binary Translation)等手段,取而代之,才可確保系統的強固性。

所以在Intel VT-X「Vanderpool」和AMD-V「Pacifica」之類的硬體輔助(Hardware Assisted)虛擬化技術出現前,要實現有效的x86處理器虛擬化,只有2條路:

  • 全虛擬化(Full Virtualization):像VMware早期的虛擬機器監視器(VM Monitor)會監視用戶端作業系統的指令碼,事先找出這些有問題的指令,再使用二進位代碼機制(Binary Translation)轉成安全的指令碼,但這會降低效能表現。
  • 半虛擬化(Paravirtualization):修改作業系統程式碼、替換製造問題的指令,讓所有指令都可在處理器上原生執行。但不同的作業系統,需配合不同的虛擬機軟體,做出不同程度的修改,導致犧牲相容性,而像死都不開放原始碼微軟Windows就根本沒機會了。

說穿了,硬體輔助虛擬化技術作的事情是「亡羊補牢」,新增特權層級,多一道「攔截網」,擋下這些不乖的指令後,再讓虛擬機管理者採用類似作業系統設陷機制啟動系統呼叫的方式,確保作為應用程式的作業系統不會搞垮大家。

前面有提到提昇切換速度的「執行資料結構」(x86的TSS)、以及強化應用程式與作業系統互動的「標準化系統呼叫介面」,Intel VT-x和AMD-V分別定義了VMCS(VM Control Structure)和VMCB(VM Control Block)資料結構,作為x86虛擬化技術的TSS。每當處理器切換、重啟、跳出作業系統前,處理器就先載入並更新其資料。因享有原生硬體加速,並可透過新增的虛擬機管理指令,反向讓作業系統意識到「原來腳底下還有土地公」,強化作業系統和虛擬機器管理者的互動,減少不必要的切換,大幅提昇執行效率。

不過Intel AMD各搞各的結果就是虛擬機管理者開發商會很辛苦,而且實現「不停機動態轉移」變成不可能的任務。

花了好大的功夫繞了好大的一圈,總算讓x86處理器可以有效率的被虛擬化,但這些年來一路疊床架屋的x86虛擬化技術哪有這麼簡單,請各位科科多多期待本專欄,科科科科科。

6 則回應