您好,登錄后才能下訂單哦!
這期內容當中小編將會給大家帶來有關怎么解析KVM虛擬化原理中的CPU虛擬化,文章內容豐富且以專業的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。
虛擬機的指令集直接運行在宿主機物理CPU上,當虛擬機中的指令設計到IO操作或者一些特殊指令的時候,控制權轉讓給了宿主機(這里其實是轉讓給了vm monitor,下面檢查VMM),也就是一個demo進程,他在宿主機上的表現形式也就是一個用戶級進程。
用一張圖來解釋更為貼切。
VMM完成vCPU,內存的初始化后,通過ioctl調用KVM的接口,完成虛擬機的創建,并創建一個線程來運行VM,由于VM在前期初始化的時候會設置各種寄存器來幫助KVM查找到需要加載的指令的入口(main函數)。所以線程在調用了KVM接口后,物理CPU的控制權就交給了VM。VM運行在VMX non-root模式,這是Intel-V或者AMD-V提供的一種特殊的CPU執行模式。然后當VM執行了特殊指令的時候,CPU將當前VM的上下文保存到VMCS寄存器(這個寄存器是一個指針,保存了實際的上下文地址),然后執行權切換到VMM。VMM 獲取 VM 返回原因,并做處理。如果是IO請求,VMM 可以直接讀取VM的內存并將IO操作模擬出來,然后再調用VMRESUME指令,VM繼續執行,此時在VM看來,IO操作的指令被CPU執行了。
Intel-V 技術是Intel為了支持虛擬化而提供的一套CPU特殊運行模式。
Intel-V 在IA-32處理器上擴展了處理器等級,原來的CPU支持ring0~ring3 4個等級,但是Linux只使用了其中的兩個ring0,ring3。當CPU寄存器標示了當前CPU處于ring0級別的時候,表示此時CPU正在運行的是內核的代碼。而當CPU處于ring3級別的時候,表示此時CPU正在運行的是用戶級別的代碼。當發生系統調用或者進程切換的時候,CPU會從ring3級別轉到ring0級別。ring3級別是不允許執行硬件操作的,所有硬件操作都需要系統提供的API來完成。
比如說一個IO操作:
int nread = read(fd, buffer, 1024);
當執行到此段代碼的時候,然后查找到系統調用號,保存到寄存器eax,然后會將對應的參數壓棧后產生一個系統調用中斷,對應的是 int $0x80。產生了系統調用中斷后,此時CPU將切換到ring0模式,內核通過寄存器讀取到參數,并完成最后的IO后續操作,操作完成后返回ring3模式。
movel $3,%eax movel fd,%ebx movel buffer,%ecx movel 1024,%edx int $0x80
Intel-V 在 ring0~ring3 的基礎上,增加了VMX模式,VMX分為root和non-root。這里的VMX root模式是給VMM(前面有提到VM monitor),在KVM體系中,就是qemu-kvm進程所運行的模式。VMX non-root模式就是運行的Guest,Guest也分ring0~ring3,不過他并不感知自己處于VMX non-root模式下。
Guest與VMM之間的切換分兩個部分:VM entry 和 VM exit。有幾種情況會導致VM exit,比如說Guest執行了硬件訪問操作,或者Guest調用了VMCALL指令或者調用了退出指令或者產生了一個page fault,或者訪問了特殊設備的寄存器等。當Guest處于VMX模式的時候,沒有提供獲取是否處于此模式下的指令或者寄存器,也就是說,Guest不能判斷當前CPU是否處于VMX模式。當產生VM exit的時候,CPU會將exit reason保存到MSRs(VMX模式的特殊寄存器組),對應到KVM就是vCPU->kvm_run->exit_reason。VMM根據exit_reason做相應的處理。
如上圖所示,VMM 開始于VMXON 指令,結束與VMXOFF指令。
第一次啟動Guest,通過VMLAUNCH指令加載Guest,這時候一切都是新的,比如說起始的rip寄存器等。后續Guest exit后再entry,是通過VMRESUME指令,此指令會將VMCS(后面會介紹到)所指向的內容加載到當前Guest的上下文,以便Guest繼續執行。
顧名思義,VMCS就是虛擬機控制結構,前面提到過很多次,Guest Exit的時候,會將當前Guest的上下文保存到VMCS中,Guest entry的時候把VMCS上下文恢復到VMM。VMCS是一個64位的指針,指向一個真實的內存地址,VMCS是以vCPU為單位的,就是說當前有多少個vCPU,就有多少個VMCS指針。VMCS的操作包括VMREAD,VMWRITE,VMCLEAR。
下面是qemu-kvm定義的exit reason。可以看到有很多可能會導致Guest轉讓控制權。選取幾個解釋一下。
static int (*const kvm_vmx_exit_handlers[])(struct kvm_vcpu *vcpu) = { [EXIT_REASON_EXCEPTION_NMI] = handle_exception, [EXIT_REASON_EXTERNAL_INTERRUPT] = handle_external_interrupt, [EXIT_REASON_TRIPLE_FAULT] = handle_triple_fault, [EXIT_REASON_NMI_WINDOW] = handle_nmi_window, // 訪問了IO設備 [EXIT_REASON_IO_INSTRUCTION] = handle_io, // 訪問了CR寄存器,地址寄存器,和DR寄存器(debug register)一樣,用于調試 [EXIT_REASON_CR_ACCESS] = handle_cr, [EXIT_REASON_DR_ACCESS] = handle_dr, [EXIT_REASON_CPUID] = handle_cpuid, // 訪問了MSR寄存器 [EXIT_REASON_MSR_READ] = handle_rdmsr, [EXIT_REASON_MSR_WRITE] = handle_wrmsr, [EXIT_REASON_PENDING_INTERRUPT] = handle_interrupt_window, // Guest執行了HLT指令,Demo開胃菜就是這個指令 [EXIT_REASON_HLT] = handle_halt, [EXIT_REASON_INVD] = handle_invd, [EXIT_REASON_INVLPG] = handle_invlpg, [EXIT_REASON_RDPMC] = handle_rdpmc, // 不太清楚以下VM系列的指令有什么用,猜測是遞歸VM(虛擬機里面運行虛擬機) [EXIT_REASON_VMCALL] = handle_vmcall, [EXIT_REASON_VMCLEAR] = handle_vmclear, [EXIT_REASON_VMLAUNCH] = handle_vmlaunch, [EXIT_REASON_VMPTRLD] = handle_vmptrld, [EXIT_REASON_VMPTRST] = handle_vmptrst, [EXIT_REASON_VMREAD] = handle_vmread, [EXIT_REASON_VMRESUME] = handle_vmresume, [EXIT_REASON_VMWRITE] = handle_vmwrite, [EXIT_REASON_VMOFF] = handle_vmoff, [EXIT_REASON_VMON] = handle_vmon, [EXIT_REASON_TPR_BELOW_THRESHOLD] = handle_tpr_below_threshold, // 訪問了高級PCI設備 [EXIT_REASON_APIC_ACCESS] = handle_apic_access, [EXIT_REASON_APIC_WRITE] = handle_apic_write, [EXIT_REASON_EOI_INDUCED] = handle_apic_eoi_induced, [EXIT_REASON_WBINVD] = handle_wbinvd, [EXIT_REASON_XSETBV] = handle_xsetbv, // 進程切換 [EXIT_REASON_TASK_SWITCH] = handle_task_switch, [EXIT_REASON_MCE_DURING_VMENTRY] = handle_machine_check, // ept 是Intel的一個硬件內存虛擬化技術 [EXIT_REASON_EPT_VIOLATION] = handle_ept_violation, [EXIT_REASON_EPT_MISCONFIG] = handle_ept_misconfig, // 執行了暫停指令 [EXIT_REASON_PAUSE_INSTRUCTION] = handle_pause, [EXIT_REASON_MWAIT_INSTRUCTION] = handle_invalid_op, [EXIT_REASON_MONITOR_INSTRUCTION] = handle_invalid_op, [EXIT_REASON_INVEPT] = handle_invept, };
KVM的CPU虛擬化依托于Intel-V提供的虛擬化技術,將Guest運行于VMX模式,當執行了特殊操作的時候,將控制權返回給VMM。VMM處理完特殊操作后再把結果返回給Guest。
CPU虛擬化可以說是KVM的最關鍵的核心,弄清楚了VM Exit和VM Entry。后續的IO虛擬化,內存虛擬化都是建立在此基礎上。
上述就是小編為大家分享的怎么解析KVM虛擬化原理中的CPU虛擬化了,如果剛好有類似的疑惑,不妨參照上述分析進行理解。如果想知道更多相關知識,歡迎關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。