l KVM:Kernel-based Virtual Machine,基於kernel的虛擬機
l VMM:Virtual Machine Monitor,虛擬機監控器,在KVM虛擬化環境中,即KVM內核。
l VM:Virtual Machine,虛擬機,即Guest機。
l 全虛擬化:Guest OS無需做任何改動即可運行。有兩種實現方式:軟件輔助實現和硬件輔助實現。
ü 軟件輔助實現的全虛擬化:一般采用優先級壓縮(Ring Compression)和二進制翻譯(Binary Translation)實現。由於一些特權指令必須運行於特權級Ring0,如LGDT,通常OS kernel運行Ring0中,這樣虛擬化環境中,VMM就沒有Ring可用了。優先級壓縮大致原理為:使VMM運行於Ring0,Guest OS kernel運行於Ring1,而Guest OS user運行於Ring3。優先級壓縮能正確處理大部分的特權指令,但是由於x86架構存在虛擬化漏洞(部分敏感指令不能被捕獲),采用二進制翻譯方法來處理這些虛擬化漏洞:VMM掃描並修改Guest的二進制代碼,將無法捕獲的敏感指令轉換為支持虛擬化的指令。
ü 硬件輔助實現的全虛擬化:依賴硬件虛擬化特性(比如Intel VT-x),基本思想是:在硬件架構上加入了足夠的虛擬化功能,使其可以截獲Guest OS中所有敏感指令,並進行模擬。
l 半虛擬化:Guest OS需要進行修改,對不能“陷入”的敏感指令進行替換,以解決敏感指令的捕獲問題。
l VT-x:Intel為CPU虛擬化提供了VT-x(Intel Virtualization for x86)技術(AMD SVM也提供了類似的功能),VT-x引入了一套新的工作模式,即VMX(Virtual Machine eXtension),該模式下的CPU具有兩種操作模式:根模式(VMX root operation)和非根模式(VMX non-root operation)。每種操作模式下,都有獨立的Ring0-Ring3。
ü VMM運行於根模式,對KVM虛擬化環境來說,即KVM主機運行於根模式,主機中的kernel運行於根模式中的Ring0,主機中用戶態程序(比如Qemu-kvm)運行於根模式中的Ring3。
ü Guest運行於非根模式,Guest中的kernel運行於非根模式中的Ring0,Guest中的用戶態程序運行於非根模式中的Ring3。
此外,VT-x還引入了一組新的指令,包括VMLAUNCH/VMRESUME(用於發起VM-Entry)、VMREAD/VMWRITE(用於配置VMCS)等。
l VM-Exit/VM-Entry:在VT-x環境中,非根模式下(即Guest中),執行敏感指令觸發的“陷入”稱為VM-Exit。VM-Exit發生時,CPU自動從非根模式切換到根模式下,然後就可以由VMM對觸發VM-Exit的敏感指令做進一步處理或模擬。
與VM-Exit對應的是VM-Entry,此操作由VMM發起,通常是VMM調度某個Guest(或VCPU)運行時引起,此時CPU自動由根模式切換為非根模式。
l VMCS:在VT-x環境中,引入了VMCS(Virtual Machine Control Structure,虛擬機控制結構),以便更好的支持CPU虛擬化。VMCS用於保存虛擬CPU需要的相關狀態,比如:CPU在根模式和非根模式下的寄存器的值、VM-Exit的原因等,當CPU發生VM-Exit和VM-Entry時,會自動查詢和更新VMCS,VMM也可以通過配置VMCS控制CPU的行為。