2 硬體虛拟機 硬體虛拟機支援在一台計算機上存在多個運作時環境,每個運作時環境可以支援一個作業系統。硬體虛拟機能夠使為某種作業系統編寫的程式在另外一種作業系統上運作,或者提供比單一作業系統上多程序之間更嚴格的運作時沙箱。硬體虛拟機現在也被稱作虛拟化或者虛拟伺服器。 能提供硬體虛拟機功能的宿主軟體也被稱作虛拟機監控器或虛拟機管理程式。 硬體虛拟機軟體主要有三種實作方式: 仿真,整系統模拟,動态翻譯全虛拟化。虛拟機模拟完整的硬體,使一個未修改的作業系統可以再在一種完全不同的微處理器上運作。Bochs、DosBox、 PearPC 、 QEMU 、 QuickTransit 、 Simics 、 VirtualPC 7 for Mac。 半虛拟化。虛拟機管理器提供一個應用程式程式設計接口供修改後的作業系統使用,能讓一個經過修改的作業系統在一種完全不同的微處理器上運作。這個應用程式程式設計接口是一個抽象的整合硬體功能的接口。 Denali 、Logic Domains、 TRANGO 、 View-OS 、 Xen 。 本地虛拟化,全虛拟化。虛拟機模拟部分硬體,使未修改的作業系統能夠在隔離狀态下運作,但需要該作業系統與底層硬體使用相同類型的微處理器。本地虛拟化用軟體方式模拟底層硬體不支援的指令,但最新的Intel和ADM的部分産品已經支援硬體輔助的本地虛拟化。這種虛拟機的執行個體有VMware公司64位x86作業系統虛拟化和Virtual Iron公司的32位和64作業系統的虛拟化、 Virtual Iron 。 2.1 仿真和動态二進制翻譯 對硬體虛拟機來說, 一個具有挑戰的問題是支援與主控端硬體上執行的指令集不同的指令集,比如在一種指令集硬體系統之上仿真另一種指令集。 最直接的仿真方法是解釋。解釋程式執行目标指令集的取指令來仿真每一個源指令集中的指令。這是一個相對較慢的過程,解釋一條源指令可能需要幾十條目标指令。 二進制翻譯經常被用來提高性能。二進制翻譯是把一段源指令轉換成一段目标指令并執行同等的功能。翻譯過程本身可能會有相當大的開銷,但是如果一段源指令被翻譯後的目标指令能夠被緩存下來,以後重複執行該段源指令就會比解釋執行快。因為二進制翻譯是程序級虛拟機最重要的特性,是以有時程序級虛拟機被稱為動态二進制翻譯器。 解釋和二進制翻譯有不同性能。解釋有着相對較低的啟動開銷,但指令的每一次模拟執行都要消耗一定的時間。二進制翻譯有着較高的啟動開銷,但每次重複進行會比較快。是以,有些虛拟機使用了經過變形的分段仿真政策,例如,根據程式的行為收集統計資訊。開始,一些指令是解釋執行的,同時記錄下那些經常被執行的指令序列。這些經常被執行的序列使用二進制翻譯。一些系統可能會對執行頻率非常高的翻譯指令做額外的優化。在絕大多數虛拟機執行一段代碼中,翻譯和二進制翻譯都會使用到。 2.2 二進制代碼優化器 大多數二進制翻譯器不僅執行從源代碼到目标代碼的轉換,同時也能執行一些代碼優化。這就産生了宿主指令集和客戶指令集相同的虛拟機,它的主要功能是二進制代碼的優化。是以,相同指令集動态二進制優化器的實作方式與虛拟機非常相似,包括分段優化和優化代碼的緩存。相同指令集動态二進制優化器能夠在程式執行過程中收集統計資訊并利用這些統計資訊優化二進制代碼。 2.3 系統級虛拟機 系統虛拟機為多個程序共存提供一個完整的系統環境。這種虛拟機在20世紀六十年代末七十年代初被開發出來,這些虛拟機也是虛拟機這個術語的來源。使用系統級虛拟機技術,能夠使一個宿主硬體平台同時支援多種客戶作業系統。在20世紀六七十年代,大型機非常龐大并且價格昂貴,計算機通常被大量的使用者共享。不同的使用者群可能希望在這個共享的硬體上運作不同的作業系統,而虛拟機不剛好能滿足這個需求。但随着工業的發展,硬體變得越來越便宜,桌上電腦也越來越普及,對于系統虛拟機的需求也越來越少。 但是近來,系統虛拟機正受到更多人的關注。那種龐大的昂貴的大型機現在被作為伺服器和伺服器群,這些伺服器可能被很多使用者共享使用。系統虛拟機最大的特點可能是他們提供多種作業系統的同時在一個硬體平台上運作的安全機制。在一個客戶系統上運作的軟體與另一個客戶系統上的軟體是完全隔離的,當一個客戶系統的安全性受到威脅或者遭受災難,運作在另一個客戶系統上的軟體不會受到影響。同時支援多種作業系統的能力可能不被大多數使用者來說也是一個很重要的吸引力,例如同時支援Windows和 Linux, 如圖1。 對系統虛拟機來說,平台複制是虛拟機管理器的重要功能,而關鍵問題是在多個客戶作業系統之間配置設定唯一的底層硬體資源。虛拟機管理器管理着硬體資源,所有的客戶作業系統及其上的應用程式都需要經過虛拟機管理器的控制。當執行某些指令,特别是涉及到的共享硬體資源的指令,會通過虛拟機控制器解釋這些指令,檢查指令的正确性并執行相關操作,客戶軟體不會感覺到虛拟機控制器的操作。 從使用者的觀點來看大多數系統虛拟機都提供了幾乎相同的功能,不同的虛拟機其不同之處在于他們是如何實作的。在圖2和圖3中,可以看到,計算機系統存在多個接口,這就導緻系統虛拟機軟體可以放置在不同的接口上。下面介紹兩種比較重要的實作方式。 系統虛拟機的第一種實作方式,是虛拟機管理器放在硬體上,虛拟機放在虛拟機管理器之上,如圖5所示。虛拟機管理器以最高權限模式運作,是以虛拟機管理器能夠解釋并實作所有客戶作業系統的指令。從某些方面來說,這種虛拟機架構是最有效的,它以幾乎相同的方式支援所有的客戶作業系統。而缺陷就是,至少對于桌上電腦使用者來說,安裝虛拟機管理器之前必須完全擦除現有的系統,并且在安裝虛拟機管理器之後安裝客戶作業系統。另一個缺陷,是需要提供針對虛拟機管理器的輸入輸出裝置驅動,因為虛拟機管理器直接和輸入輸出裝置互動。

圖5 虛拟機位于硬體層之上 另一種如圖6所示,虛拟機管理器放在已存在的宿主作業系統之上,這個虛拟機也被稱為宿主虛拟機。這樣,安裝虛拟機的過程就類似于安裝一個典型的應用程式的過程。并且,虛拟軟體能夠利用宿主作業系統提供裝置驅動和其他基本服務。而缺陷就是,這樣會帶來一些性能的損失,因為作業系統的服務要通過更多的軟體層次來實作。宿主虛拟機方式被使用在VMware的實作中,它是一個現代的系統虛拟機,運作于IA-32硬體平台之上。
圖6 虛拟機位于作業系統之上 2.4 全系統虛拟機與仿真 對于傳統的系統虛拟機,所有的系統軟體和應用軟體都使用與底層硬體相同的指令集架構。但在另外的一些情況下,客戶系統和是宿主系統使用不同的指令集架構。例如,基于PowerPC的Apple系統和Windows系統使用不同的指令集架構,這也是兩種最流行的桌面系統。因為軟體系統和硬體系統緊密地聯系在一起,會導緻使用者需要購買同一軟體的針對不同平台的版本,這會使軟體支援變得複雜并且會是使用者的購買力下降。這種情況導緻了對系統虛拟機的需求,這是一個完整的軟體系統,包括作業系統和應用程式,它能夠支援在宿主系統上運作另一種不同的指令集和作業系統。因為指令集結構不同,應用程式和作業系統代碼都需要仿真。對完整系統虛拟機來說,常用的一種實作方法是将虛拟機管理器和客戶軟體放在一個傳統的宿主作業系統上。 圖6描述了一個系統虛拟機,它建立在一個擁有自己的作業系統和應用程式的傳統系統之上。這種虛拟機的一個例子是Virtual PC,它能使Windows作業系統運作在Macintosh系統上。虛拟機軟體是作為一個應用程式運作在宿主作業系統上,它使用宿主系統的指令集操作。為了實作這種類型的虛拟機,虛拟軟體需要仿真整個硬體環境。它必須控制所有指令的仿真,并且需要将客戶系統的指令集操作轉換成對應的宿主作業系統的系統調用。即使使用二進制翻譯,也無法有效利用宿主系統指令集架構的特性,如虛拟記憶體管理和中斷管理。另外,如果客戶系統和宿主系統的硬體資源有顯著的差異,則會帶來實作上的一些問題, 而解決這些問題是實作完整系統虛拟機面臨的主要挑戰。 2.5 協同設計虛拟機 以上所讨論的虛拟機模型, 都是為了功能和移植,包括在同一個平台上支援多種作業系統或者多種指令集架構。事實上, 這些虛拟機都是基于已經存在的某種标準指令集或作業系統開發的。大體上來說,提高性能不是一個目标, 反而降低性能損失常常是一個需要考慮的問題。 協同設計虛拟機則有不同的目标, 并且有着不同的實作方式。設計這些虛拟機是為了使新的指令集架構或硬體實作能提高性能或提高效率。宿主指令集架構可能是全新的,也可能是基于某種存在的指令集架構增加或删除了部分指令。協同設計虛拟機沒有對應的指令集架構應用程式,它本身可以看成是硬體實作的一部分。 在某些方面,協同設計虛拟機類似于在許多高性能超标量體系結構微處理器中用到的硬體虛拟方法。在這種設計中,将架構中的寄存器重命名為實體上的真實的寄存器,将複雜的指令分解為較簡單的指令。 ----劉黎明( [email protected] )