全虛擬化和半虛擬化的區別 cpu的ring0 ring1又是什麼概念?

原文地址:http://www.cnblogs.com/xusongwei/archive/2012/07/30/2615592.html

    

    ring0是指CPU的運行級別,ring0是最高級別,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兩種模式,兩種模式都支持Ring 0 ~ Ring 3 這 4 個運行級別。這下好了,VMM可以運行在VMX root operation模式下,客戶OS運行在VMX non-root operation模式下。也就說,硬件這層做了些區分,這樣全虛擬化下,有些靠“捕獲異常-翻譯-模擬”的實現就不需要了。而且CPU廠商,支持虛擬化 的力度越來越大,靠硬件輔助的全虛擬化技術的性能逐漸逼近半虛擬化,再加上全虛擬化不需要修改客戶操作系統這一優勢,全虛擬化技術應該是未來的發展趨勢。

    XEN是最典型的半虛擬化,不過現在XEN也支持硬件輔助的全虛擬化,大趨勢,拗不過啊。。。 
    KVM、VMARE這些一直都是全虛擬化。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章