本文來自:http://www.ywnds.com/?p=5856
虛擬化
雲計算現在已經非常成熟了,而虛擬化是構建雲計算基礎架構不可或缺的關鍵技術之一。 雲計算的雲端系統, 其實質上就是一個大型的分布式系統。 虛擬化通過在一個物理平台上虛擬出更多的虛擬平台, 而其中的每一個虛擬平台則可以作為獨立的終端加入雲端的分布式系統。 比起直接使用物理平台, 虛擬化在資源的有效利用、 動態調配和高可靠性方面有着巨大的優勢。 利用虛擬化, 企業不必拋棄現有的基礎架構即可構建全新的信息基礎架構,從而更加充分地利用原有的IT投資。
虛擬化技術
虛擬化是一個廣義的術語,是指計算元件在虛擬的基礎上而不是真實的基礎上運行,是一個為了簡化管理、優化資源的解決方案。
在X86平台虛擬化技術中,新引入的虛擬化層通常稱為虛擬機監控器(Virtual MachineMonitor, VMM), 也叫做Hypervisor。 虛擬機監控器運行的環境,也就是真實的物理平台,稱之為宿主機。而虛擬出來的平台通常稱為客戶機,里面運行的系統對應地也稱為客戶機操作系統,如下圖:
1974年,Popek和Goldberg在一篇論文中定義了“經典虛擬化(Classical virtualization)”的基本需求,他們認為,一款真正意義上的VMM至少要符合三個方面的標准:
- 等價執行(Equivalient execution):除了資源的可用性及時間上的不同之外,程序在虛擬化環境中及真實環境中的執行是完全相同的。
- 性能(Performance):指令集中的大部分指令要能夠直接運行於CPU上。
- 安全(Safety):VMM要能夠完全控制系統資源。
虛擬化技術有很多種實現方式, 比如軟件虛擬化和硬件虛擬化, 再比如半虛擬化和全虛擬化。 下面將針對每種實現方式做一個簡單的介紹。
CPU虛擬化技術實現
一、軟件虛擬化和硬件虛擬化
1)虛擬化—軟件方案
純軟件虛擬化, 顧名思義, 就是用純軟件的方法在現有的物理平台上(往往並不支持硬件虛擬化) 實現對物理平台訪問的截獲和模擬。常見的軟件虛擬機例如QEMU,它是通過純軟件來仿真X86平台處理器的取指、解碼和執行,客戶機的指令並不在物理平台上直接執行。由於所有的指令都是軟件模擬的,因此性能往往比較差,但是可以在同一平台上模擬不同架構平台的虛擬機。
VMWare的軟件虛擬化則使用了動態二進制翻譯(BT)的技術,與QEMU這種模擬的方式不同,BT是一種加速虛擬化的方案之一,另一種常見的虛擬化加速方案就是硬件輔助虛擬化技術。BT就是在虛擬機監控機可控制的范圍內,允許客戶機的指令在物理平台上直接運行。但是,客戶機指令在運行前會被虛擬機監控機掃描,其中突破虛擬機監控機限制的指令會被動態替換為可以在物理平台上直接運行的安全指令,或者替換為對虛擬機監控器的軟件調用。這樣做的好處是比純軟件模擬性能有大幅的提升(模擬其根本就是通過一個軟件做出一個假的,可以是不存在的;而虛擬是把這個設備通過某種切割或其他方式虛擬出去提供一定程度的服務), 但是也同時失去了跨平台虛擬化的能力。
有了BT技術后,Guest的用戶空間運行在CPU ring 3上,而Guest的內核空間運行在了CPU ring 1上,Host的內核空間運行在CPU ring 0上。BT就監控在CPU ring 1上,隨時將Guest內核的調用給轉換為特權指令調用。當然CPU ring 1並沒有被使用,BT這種技術讓虛擬化性能得到了大大的提升。但是BT有一個大大的缺點就是無法跨平台,使用QEMU這種模擬器不管底層硬件是什么,能模擬各種CPU架構平台,如PowerPC、ARM等;但是BT卻無法做到這點,BT強烈依賴底層架構,比如底層是X86的那么只能創建X86 CPU的虛擬機。
在純軟件虛擬化解決方案中,VMM在軟件套件中的位置是傳統意義上操作系統所處的位置,而操作系統的位置是傳統意義上應用程序所處的位置, 這種轉換必然會增加系統的復雜性。軟件堆棧的復雜性增加意味着,這些環境難於管理,因而會加大確保系統可靠性和安全性的困難。
2) 虛擬化—硬件方案
硬件輔助虛擬化(HVM),簡而言之,就是物理平台本身提供了對特殊指令的截獲和重定向的硬件支持,甚至,新的硬件會提供額外的資源來幫助軟件實現對關鍵硬件資源的虛擬化,從而提升性能。可以理解為CPU額外增加了一個ring -1環專門提供給虛擬機運行的。以X86平台的虛擬化為例,支持虛擬技術的X86 CPU帶有特別優化過的指令集來控制虛擬過程,通過這些指令集,VMM會很容易將客戶機置於一種受限制的模式下運行,一旦客戶機試圖訪問物理資源,硬件會暫停客戶機的運行,將控制權交回給VMM處理。VMM還可以利用硬件的虛擬化增強機制,將客戶機在受限模式下對一些特定資源的訪問,完全由硬件重定向到VMM指定的虛擬資源,整個過程不需要暫停客戶機的運行和VMM軟件的參與。
由於虛擬化硬件可提供全新的架構,支持操作系統直接在上面運行,無需進行二進制轉換,減少了相關的性能開銷,極大簡化了VMM 設計,進而使VMM能夠按通用標准進行編寫, 性能更加強大。
需要說明的是, 硬件虛擬化技術是一套解決方案。完整的情況需要CPU、主板芯片組、BIOS和軟件的支持,例如VMM軟件或者某些操作系統本身。即使只是CPU支持虛擬化技術,在配合VMM軟件的情況下,也會比完全不支持虛擬化技術的系統有更好的性能。鑒於虛擬化的巨大需求和硬件虛擬化產品的廣闊前景,Intel一直都在努力完善和加強自己的硬件虛擬化產品線。自2005年末,Intel便開始在其處理器產品線中推廣應用Intel Virtualization Technology(IntelVT)虛擬化技術,發布了具有IntelVT虛擬化技術的一系列處理器產品,包括桌面的Pentium和Core系列,還有服務器的Xeon至強和Itanium安騰。Intel一直保持在每一代新的處理器架構中優化硬件虛擬化的性能和增加新的虛擬化技術。現在市面上,從桌面的Core i3/5/7,到服務器端的E3/5/7/9,幾乎全部都支持Intel VT技術。可以說, 在不遠的將來, Intel VT很可能會成為所有Intel處理器的標准配置。當然AMD的CPU也都支持虛擬化技術。
總結
硬件輔助虛擬化貌似比BT技術更好,如果BT技術能夠讓虛擬機性能達到物理機80%的性能的話,那么硬件輔助虛擬化(HVM)就能夠讓虛擬機性能達到物理機85%左右。當然這中間的轉換還是需要的,只不過是由硬件直接完成了,僅此而已。
二、全虛擬化和半虛擬化
Full-virtualization(全虛擬化)
全虛擬化為客戶機提供了完整的虛擬X86平台, 包括處理器、 內存和外設, 支持運行任何理論上可在真實物理平台上運行的操作系統, 為虛擬機的配置提供了最大程度的靈活性。不需要對客戶機操作系統做任何修改即可正常運行任何非虛擬化環境中已存在基於X86平台的操作系統和軟件,這也是全虛擬化無可比擬的優勢。
在全虛擬化情況下,虛擬機並不知道自己運行在虛擬化環境下,是無感知的,安裝使用時跟在物理機上沒有什么區別。但是這種完全虛擬化中間需要軟件做支撐的,需要軟件去模擬提供所有的硬件資源,至少是這個CPU的特權指令需要用軟件去模擬的,因為你要讓各Guest並不知道自己運行在虛擬環境中,那么你就必須要提供一個帶有特權指令的CPU。
在虛擬化環境中,通常虛擬跟模擬是兩個概念,VMWare的動態二進制翻譯技術(BT)是虛擬的而QEMU軟件技術是模擬的。最大的區別在於,模擬通過軟件實現時需要模擬CPU ring 0-3,也就是需要轉換CPU ring 0-3所有的指令,而虛擬只需要轉換CPU ring 0特權指令即可。
當然不管上面說到的BT技術還是QEMU還是硬件輔助虛擬化技術都屬於完全虛擬化技術,都是需要指令轉換的,都是需要復雜的步驟才能完成的,如果我們能夠精簡這其中的步驟那么虛擬機的性能一定會有提升的。那么怎么精簡呢?這就是下面說的半虛擬化技術。另外,在全虛擬化模式下:
CPU如果不支持硬件虛擬化技術:那么所有指令都是通過VMM虛擬的,通過VMM內的BT動態翻譯技術把虛擬機要運行的特權指令轉換為物理指令集,然后到CPU上運行。
CPU如果支持硬件虛擬化技術:VMM運行ring -1,而GuestOS運行在ring 0。
Para-virtualization(半虛擬化)
軟件虛擬化可以在缺乏硬件虛擬化支持的平台上完全通過VMM軟件來實現對各個虛擬機的監控,以保證它們之間彼此獨立和隔離。 但是付出的代價是軟件復雜度的增加,和性能上的損失。減輕這種負擔的一種方法就是,改動客戶操作系統,使它知道自己運行在虛擬環境下,能夠與虛擬機監控機協同工作。這種方法就叫半虛擬化(para-virtualization)。虛擬機內核明確知道自己是運行在虛擬化之上的,對於硬件資源的使用不再需要BT而是自己向VMM申請使用,如對於內存或CPU的使用是直接向VMM申請使用,直接調用而非翻譯。就算對於I/O設備的使用它也可以通過Hyper Call(Hypervisor提供的系統調用)直接可以跟硬件打交道,減少了中間的翻譯步驟自然性能就好了,據說這種半虛擬化方式能夠讓虛擬化達到物理機90%的性能。本質上,半虛擬化弱化了對虛擬機特殊指令的被動截獲要求,將其轉化成客戶機操作系統的主動通知。但是,半虛擬化需要修改客戶機操作系統的源代碼來實現主動通知。
Xen是開源准虛擬化技術的一個例子,操作系統作為虛擬服務器在Xen Hypervisor上運行之前,它必須在內核層面進行某些改變。因此,Xen適用於BSD、Linux、Solaris及其他開源操作系統,但不適合對像Windows這些專有的操作系統進行虛擬化處理,因為它們不
公開源代碼,所以無法修改其內核。
總結
由於硬件輔助虛擬化的出現,使得完全虛擬化在性能上也得到了提升。並且相比半虛擬化而言,完全虛擬化使用上更加簡化,虛擬過程對於Guest而言是透明的。所以完全虛擬化更加符合市場需求,比如后面說的KVM虛擬機。
內存虛擬化技術實現
說完虛擬化技術中最重要的CPU相關技術外,下面再來說說計算機五大部件中的第二大部件存儲器,內存虛擬化技術。
首先我們知道內存本身就類似於虛擬化技術,其通過虛擬地址對外提供服務,所有的進程都以為自己可以使用所有的物理內存。如下圖提供了在非虛擬化中和虛擬化中尋址方式。

No Virtualation
在非虛擬化中,系統把物理地址通過虛擬地址的方式(一個個頁框)提供出去給進程使用,每個進程都以為自己可以使用所有的物理內存。本來在CPU上有個稱為MMU(memory management unit)的東西,任何時候當某個進行想要訪問數據自己的線性地址中的某段數據的時候,就是虛擬地址。這個進程就會傳給CPU一個地址,並需要讀取數據,但是CPU知道這個地址是無法真正訪問到數據的,於是CPU要通過MMU將這段地址轉換為對應物理地址的訪問,從而這段數據就能訪問到了。一般進程所得到的內存地址空間是一個連續的虛擬地址空間,而在真正的物理內存存儲時一般都不會是連續的地址空間。
In Virtualation
為了實現內存虛擬化,讓客戶機使用一個隔離的、從零開始且具有連續的內存空間,像KVM虛擬機引入一層新的地址空間,即客戶機物理地址空間 (Guest Physical Address, GPA),這個地址空間並不是真正的物理地址空間,它只是宿主機虛擬地址空間在客戶機地址空間的一個映射。對客戶機來說,客戶機物理地址空間都是從零開始的連續地址空間,但對於宿主機來說,客戶機的物理地址空間並不一定是連續的,客戶機物理地址空間有可能映射在若干個不連續的宿主機地址區間。
從上圖我們看出,在虛擬化環境中,由於虛擬機物理地址不能直接用於宿主機物理MMU進行尋址,所以需要把虛擬機物理地址轉換成宿主機虛擬地址 (Host Virtual Address, HVA)。運行在硬件之上的Hypervisor首先會對物理內存進行虛擬地址 (Host Virtual Address, HVA)轉換,然后還需要對轉換后的虛擬地址內存空間進行再次虛擬,然后輸出給上層虛擬機使用,而在虛擬機中同樣又要進行GVA轉換到GPA操作。顯然通過這種映射方式,虛擬機的每次內存訪問都需要Hypervisor介入,並由軟件進行多次地址轉換,其效率是非常低的。
因此,為了提高GVA到HPA轉換的效率,目前有兩種實現方式來進行客戶機虛擬地址到宿主機物理地址之間的直接轉換。其一是基於純軟件的實現方式,也即通過影子頁表(Shadow Page Table)來實現客戶虛擬地址到宿主機物理地址之間的直接轉換(KVM虛擬機是支持的)。其二是基於硬件輔助MMU對虛擬化的支持,來實現兩者之間的轉換。
其中Shadow Page Table(影子頁表),其實現非常復雜,因為每一個虛擬機都需要有一個Shadow Page Table。並且這種情況會出現一種非常惡劣的結果,那就是TLB(Translation Lookaside Buffer,傳輸后備緩沖器)很難命中,尤其是由多個虛擬主機時,因為TLB中緩存的是GVA到GPA的轉換關系,所以每一次虛擬主機切換都需要清空TLB,不然主機之間就會發生數據讀取錯誤(因為各主機間都是GVA到GPA)。傳輸后備緩沖器是一個內存管理單元用於改進虛擬地址到物理地址轉換后結果的緩存,而這種問題也會導致虛擬機性能低下。
此外,Intel的EPT(Extent Page Table) 技術和AMD的NPT(Nest Page Table) 技術都對內存虛擬化提供了硬件支持。這兩種技術原理類似,都是在硬件層面上實現客戶機虛擬地址到宿主機物理地址之間的轉換。稱為Virtualation MMU。當有了這種MMU虛擬化技術后,對於虛擬機進程來說還是同樣把GVA通過內部MMU轉換為GPA,並不需要改變什么,保留了完全虛擬化的好處。但是同時會自動把GVA通過Virtualation MMU技術轉換為真正的物理地址(HPA)。很明顯減少了由GPA到HPA的過程,提升虛擬機性能。
並且CPU廠商還提供了TLB硬件虛擬化技術,以前的TLB只是標記GVA到GPA的對應關系,就這兩個字段,現在被擴充為了三個字段,增加了一個主機字段,並且由GVA到GPA以及對應變成了GVA到HPA的對應關系。明確說明這是哪個虛擬機它的GVA到HPA的映射結果。
總結
由此看出內存虛擬化,如果沒有硬件做支撐,那么只能使用Shadow Page Table(影子頁表),也就意味着TLB需要不斷地進行清空。而有了內存虛擬機技術后,虛擬機的性能在某種程度上也得到了大大地提升。
I/O虛擬化技術實現
從處理器的角度看,外設是通過一組I/O資源(端口I/O或者是MMIO)來進行訪問的,所以設備的相關虛擬化被稱為I/O虛擬化,如:
1)外存設備:硬盤、光盤、U盤。
2)網絡設備:網卡。
3)顯示設備:VGA(顯卡)。
4)鍵盤鼠標:PS/2、USB。
還有一些如串口設備、COM口等等設備統稱IO設備,所謂IO虛擬化就是提供這些設備的支持,其思想就是VMM截獲客戶操作系統對設備的訪問請求,然后通過軟件的方式來模擬真實設備的效果。基於設備類型的多樣化,I/O虛擬化的方式和特點紛繁復雜,我們挑一些常用IO設備說一說。
但一般IO虛擬化的方式有以下三種,如下圖:

第一種:模擬I/O設備
完全使用軟件來模擬,這是最簡單但性能最低的方式,對於IO設備來說模擬和完全虛擬化沒有太大意義上的區別。VMM給Guest OS模擬出一個IO設備以及設備驅動,Guest OS要想使用IO設備需要調內核然后通過驅動訪問到VMM模擬的IO設備,然后到達VMM模擬設備區域。VMM模擬了這么多設備以及VMM之上運行了那么多主機,所以VMM也提供了一個I/O Stack(多個隊列)用來調度這些IO設備請求到真正的物理IO設備之上。經過多個步驟才完成一次請求。
舉例:Qemu、VMware Workstation
第二種:半虛擬化
半虛擬化比模擬性能要高,其通過系統調用直接使用I/O設備,跟CPU半虛擬化差不多,虛擬化明確知道自己使用的IO設備是虛擬出來的而非模擬。VMM給Guest OS提供了特定的驅動程序,在半虛擬化IO中我們也稱為“前端IO驅動”;跟模擬I/O設備工作模式不同的是,Guest OS自己本身的IO設備不需要處理IO請求了,當Guest OS有IO請求時通過自身驅動直接發給VMM進行處理,而在VMM這部分的設備處理我們稱之為“后端IO驅動”。
舉例:Xen、virtio
第三種:I/O透傳技術
I/O透傳技術(I/O through)比模擬和半虛擬化性能都好,幾乎進階於硬件設備,Guest OS直接使用物理I/O設備,操作起來比較麻煩。其思想就是提供多個物理I/O設備,如硬盤提供多塊,網卡提供多個,然后規划好宿主機運行Guest OS的數量,通過協調VMM來達到每個Guest OS對應一個物理設備。另外,要想使用I/O透傳技術,不光提供多個I/O設備還需要主板上的I/O橋提供支持透傳功能才可以,一般Intel提供的這種技術叫VT-d,是一種基於北橋芯片的硬件輔助虛擬化技術,主要功能是由來提高I/O靈活性、可靠性和性能的。
為什么I/O透傳還需要主板支持呢?每個虛擬機直接使用一個網卡不就可以了嗎?主要是因為在我們傳統的X86服務器架構上,所有的IO設備通常有一個共享或集中式的DMA(直接內存訪問),DMA是一種加速IO設備訪問的方式。由於是集中式的,所以在VMM上管理多塊網卡時其實使用的還是同一個DMA,如果讓第一個Guest OS直接使用了第一塊網卡,第二個Guest OS直接使用第二塊網卡,但使用的DMA還是同一個,而DMA是無法區分哪個Guest OS使用的是哪塊網卡,這就變的麻煩了。而像Intel的VT-d就是用來處理這些問題的,以及處理各主機中斷。
舉例:Intel VT-d
對應具體設備是如何實現?
1)硬盤如何虛擬化?
虛擬化技術中,CPU可以按時間切割,內存可以按空間切割,那么磁盤設備呢?也可以按照空間來切割,把硬盤划分成一個一個的區域。但是好像沒有這么用的,一般磁盤虛擬化的方式就是通過模擬的技術來實現。
2)網卡如何虛擬化?
網卡的虛擬化方式一般使用模擬、半虛擬化、IO透傳技術都行,其實現方式根據VMM的不同有所不同,一般的VMM都會提供所有的方式。
3)顯卡如何虛擬化?
顯卡虛擬化通常使用的方式叫frame buffer(幀緩存機制),通過frame buffer給每個虛擬機一個獨立的窗口來實現。當然其實對於顯示設備的虛擬化是比較麻煩的,所以通常在虛擬化環境中我們的顯示設備性能都不會很好的,當然安裝個Windows顯示還是沒有問題的,但不適用圖形處理類的服務。
4)鍵盤鼠標如何虛擬化?
我們在虛擬機中使用鍵盤鼠標通常都是通過模擬的方式實現的,通過焦點捕獲將模擬的設備跟當前設備建立關聯關系,比如你使用Vmware workstation時把鼠標點進哪個虛擬機后,相當於被此虛擬機捕獲了,所有的操作都是針對此虛擬機了。
總結
簡單描述了CPU虛擬化、內存虛擬化、IO虛擬化的實現方式。其一,我們大概知道了如何選擇虛擬化主機性能會最大化,CPU支持硬件輔助虛擬化技術,如Intel的VT;內存支持硬件輔助虛擬化技術,如Virtualization mmu和TLB;IO支持硬件輔助虛擬化技術,如Intel的VT-d。當然光有硬件的支持還不是太夠,在使用虛擬化時要能夠充分利用到這些硬件才行。
虛擬化的運行模式
Type-I:直接運行在操作系統之上的虛擬化,模式如下圖:

如:Vmware workstations、Kvm等。
Type-II:直接運行在硬件之上的(提供各種硬件驅動),模式如下圖:

如:Vmware EXSI、Xen等。
但是Xen有點特別,雖然也是直接安裝在硬件之上,提供Hypervisor,但是只負責CPU、內存、中斷,不提供I/O驅動,需要額外安裝一個虛擬機再安裝一個Linux系統用來管理I/O設備,如下圖:

Type-III:其他類型
當然,除了上面提到的基於操作系統或直接基於硬件的虛擬化外,還有如下常見的類型。
容器虛擬化
基於內核的虛擬化,所有的虛擬機都是一個獨立的容器,但共同運行硬件之上,使用着同一個內核。優點就是速度快,部署容易,缺點就是相互間的資源相互隔離比較麻煩,但現在市場也都有了相對成熟的解決方案。如,如今大火的Docker,網上都有人說Docker具有取代虛擬化的勢頭。
模擬器虛擬化
通過模擬器模擬所有的硬件,如QEMU,KVM就是使用QEMU。
庫虛擬化
通過在操作系統之上模擬出不同系統的庫,如Linux上運行Wine就可以支持Windows上的軟件運行,Windows上運行Cywin就可以支持Linux上的軟件運行。因為現在操作系統都是遵循POSIX標准,所以各自提供的庫接口都是同一個標准,只需要在對應的平台上運行一個可以提供對方庫的軟件,然后在此軟件之上運行針對對方系統編譯好的軟件即可。為什么要運行針對對方平台編譯好的軟件,因為雖然庫統一了,但是各自的ABI(應用二進制接口)接口還是不同的。
X86平台實現虛擬化技術的挑戰?
首先我們知道X86處理器有4個特權級別,Ring 0~Ring 3,只有運行在Ring 0 ~ 2級時,處理器才可以訪問特權資源或執行特權指令,運行在Ring 0級時,處理器可以運行所有的特權指令。X86平台上的操作系統一般只使用Ring 0和Ring 3這兩個級別,其中,操作系統內核運行在Ring 0級,也被稱為內核空間指令,用戶進程運行在Ring 3級,也被稱為用戶空間指令。
特權級壓縮(ring compression)
為了滿足上面所述的需求,VMM自身必須運行在Ring 0級,同時為了避免Guest OS控制系統資源,Guest OS不得不降低自身的運行級別而運行於Ring 3(Ring 1、2 不使用)。
此外,VMM使用分頁或段限制的方式保護物理內存的訪問,但是64位模式下段限制不起作用,而分頁又不區分Ring 0,1,2。為了統一和簡化VMM的設計,Guest OS只能和用戶進程一樣運行在Ring 3。VMM必須監視Guest OS對GDT、IDT等特權資源的設置,防止Guest OS運行在Ring 0級,同時又要保護降級后的Guest OS不受Guest進程的主動攻擊或無意破壞。
特權級別名(Ring Alias)
設計上的原因,操作系統假設自己運行於ring 0,然而虛擬化環境中的Guest OS實際上運行於Ring 1或Ring 3,由此,VMM必須保證各Guest OS不能得知其正運行於虛擬機中這一事實,以免其打破前面的“等價執行”標准。例如,x86處理器的特權級別存放在CS代碼段寄存器內,Guest OS卻可以使用非特權PUSH指令將CS寄存器壓棧,然后POP出來檢查該值;又如,Guest OS在低特權級別時讀取特權寄存器GDT、LDT、IDT和TR時並不發生異常。這些行為都不同於Guest OS的正常期望。
地址空間壓縮(Address Space Compression)
地址空間壓縮是指VMM必須在Guest OS的地址空間中保留一段供自己使用,這是x86虛擬化技術面臨的另一個挑戰。VMM可以完全運行於自有的地址空間,也可以部分地運行於Guest OS的地址空間。前一種方式,需在VMM模式與Guest OS模式之間切換,這會帶來較大的開銷;此外,盡管運行於自己的地址空間,VMM仍需要在Guest OS的地址空間保留出一部分來保存控制結構,如IDT和GDT。無論是哪一種方式,VMM必須保證自己用到地址空間不會受到Guest OS的訪問或修改。
非特權敏感指令
x86使用的敏感指令並不完全隸屬於特權指令集,VMM將無法正確捕獲此類指令並作出處理。例如,非特權指令SMSW在寄存器中存儲的機器狀態就能夠被Guest OS所讀取,這違反了經典虛擬化理論的要求。
靜默特權失敗(Silent Privilege Failures)
x86的某些特權指令在失敗時並不返回錯誤,因此,其錯誤將無法被VMM捕獲,這將導致其違反經典虛擬化信條中的“等價執行”法則。
中斷虛擬化(Interrupt Virtualization)
虛擬化環境中,屏蔽中斷及非屏蔽中斷的管理都應該由VMM進行;然而,GuestOS對特權資源的每次訪問都會觸發處理器異常,這必然會頻繁屏蔽或啟用中斷,如果這些請求均由VMM處理,勢必會極大影響整體系統性能。

