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這些一直都是全虛拟化。