天天看點

全虛拟化和半虛拟化的差別

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 這種半虛拟化技術,客戶機作業系統都是有一個專門的定制核心版本,和x86、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一直都是全虛拟化。

繼續閱讀