cpu運行級別:
ring0是指CPU的最高運行級別,ring1次之,ring2其次…… 拿Linux+x86來講, 操做系統(內核)的代碼運行在最高運行級別ring0上,可使用特權指令,控制中斷、修改頁表、訪問設備等等。應用程序的代碼運行在最低運行級別上ring3上,不能作受控操做。若是要作,好比要訪問磁盤,寫文件,那就要經過執行系統調用(函數),執行系統調用的時候,CPU的運行級別會發生從ring3到ring0的切換,並跳轉到系統調用對應的內核代碼位置執行,這樣內核就爲你完成了設備訪問,完成以後再從 ring0返回ring3。這個過程也稱做用戶態和內核態的切換。
那麼,虛擬化在這裏就遇到了一個難題,由於宿主操做系統是工做在ring0的,客戶操做系統就不能也在ring0了,可是它不知道這一點,之前執行什麼指令,如今仍是執行什麼指令,那確定不行啊,沒權限啊。因此這時候虛擬機管理程序(VMM)就要避免這件事情發生。 (VMM在ring0上,通常以驅動程序的形式體現,驅動程序都是工做在ring0上,不然驅動不了設備) 通常是這樣作,客戶操做系統執行特權指令時,會觸發異常(CPU機制,沒權限的指令,觸發異常),而後VMM捕獲這個異常,在異常裏面作翻譯,模擬,最後返 回到客戶操做系統內,客戶操做系統認爲本身的特權指令工做正常,繼續運行。可是這個性能損耗,就很是的大,你想一想原來,簡單的一條指令,執行完便可,如今卻要經過複雜的異常處理過程。
這時候半虛擬化就來了,半虛擬化的思想就是,讓客戶操做系統知道本身是在虛擬機上跑的,工做在非ring0狀態,那麼它原先在物理機上執行的一些特權指令,就會修改爲其餘方式,這種方式是能夠和VMM約定好的,這就至關於,我經過修改代碼把操做系統移植到一種新的架構上來,就是定製化。因此像XEN 這種半虛擬化技術,客戶機操做系統都是有一個專門的定製內核版本,和x8六、mips、arm這些內核版本等價。這樣以來,就不會有捕獲異常、翻譯、模擬 的過程了,性能損耗很是低。這就是XEN這種半虛擬化架構的優點。這也是爲何XEN只支持虛擬化Linux,沒法虛擬化windows緣由,微軟是閉源的,不能夠代碼。
後來,CPU廠商,開始支持虛擬化了,狀況又發生變化,拿X86 CPU來講,引入了Intel-VT 技術,支持Intel-VT的CPU,有VMX root operation 和 VMX non-root operation兩種模式,兩種模式都支持Ring0~Ring3 這4個運行級別。這下好了,VMM能夠運行在VMX root operation模式下,客戶OS運行在VMX non-root operation模式下。也就說,硬件這層作了些區分,這樣全虛擬化下,有些靠「捕獲異常-翻譯-模擬」的實現就不須要了。並且CPU廠商,支持虛擬化 的力度愈來愈大,靠硬件輔助的全虛擬化技術的性能逐漸逼近半虛擬化,再加上全虛擬化不須要修改客戶操做系統這一優點,全虛擬化技術應該是將來的發展趨勢。
XEN是最典型的半虛擬化,不過如今XEN也支持硬件輔助的全虛擬化,畢竟全虛擬化是大趨勢。 KVM、VMware一直都是全虛擬化。windows