本文來自:http://www.ywnds.com/?p=5856前端
雲計算如今已經很是成熟了,而虛擬化是構建雲計算基礎架構不可或缺的關鍵技術之一。 雲計算的雲端系統, 其實質上就是一個大型的分佈式系統。 虛擬化經過在一個物理平臺上虛擬出更多的虛擬平臺, 而其中的每個虛擬平臺則能夠做爲獨立的終端加入雲端的分佈式系統。 比起直接使用物理平臺, 虛擬化在資源的有效利用、 動態調配和高可靠性方面有着巨大的優點。 利用虛擬化, 企業沒必要拋棄現有的基礎架構便可構建全新的信息基礎架構,從而更加充分地利用原有的IT投資。後端
虛擬化是一個廣義的術語,是指計算元件在虛擬的基礎上而不是真實的基礎上運行,是一個爲了簡化管理、優化資源的解決方案。緩存
在X86平臺虛擬化技術中,新引入的虛擬化層一般稱爲虛擬機監控器(Virtual MachineMonitor, VMM), 也叫作Hypervisor。 虛擬機監控器運行的環境,也就是真實的物理平臺,稱之爲宿主機。而虛擬出來的平臺一般稱爲客戶機,裏面運行的系統對應地也稱爲客戶機操做系統,以下圖:安全
1974年,Popek和Goldberg在一篇論文中定義了「經典虛擬化(Classical virtualization)」的基本需求,他們認爲,一款真正意義上的VMM至少要符合三個方面的標準:服務器
虛擬化技術有不少種實現方式, 好比軟件虛擬化和硬件虛擬化, 再好比半虛擬化和全虛擬化。 下面將針對每種實現方式作一個簡單的介紹。網絡
1、軟件虛擬化和硬件虛擬化架構
1)虛擬化—軟件方案分佈式
純軟件虛擬化, 顧名思義, 就是用純軟件的方法在現有的物理平臺上(每每並不支持硬件虛擬化) 實現對物理平臺訪問的截獲和模擬。常見的軟件虛擬機例如QEMU,它是經過純軟件來仿真X86平臺處理器的取指、解碼和執行,客戶機的指令並不在物理平臺上直接執行。因爲全部的指令都是軟件模擬的,所以性能每每比較差,可是能夠在同一平臺上模擬不一樣架構平臺的虛擬機。ide
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%左右。固然這中間的轉換仍是須要的,只不過是由硬件直接完成了,僅此而已。
2、全虛擬化和半虛擬化
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或者是MMIO)來進行訪問的,因此設備的相關虛擬化被稱爲I/O虛擬化,如:
1)外存設備:硬盤、光盤、U盤。
2)網絡設備:網卡。
3)顯示設備:VGA(顯卡)。
4)鍵盤鼠標:PS/二、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處理器有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 一、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處理,勢必會極大影響總體系統性能。