Intel的cpu虚拟化
intel的cpu虛擬化,就不得不提到vt-x。vt-x是intel的CPU硬件虛擬化技術,但是在操作系統內部查看cpu的flag時,是否支持硬件虛擬化的的判斷標準是是否有vmx,vmx是什么,它和虛擬化有什么關系
幾個基礎概念
1.VMM:
虛擬機監視器在宿主機上表現為一個提供虛擬機CPU,內存以及一系列硬件虛擬的實體,這個實體在KVM體系中就是一個進程,如qemu-kvm。VMM負責管理虛擬機的資源,并擁有所有虛擬機資源的控制權,包括切換虛擬機的CPU上下文等。
2.Guest:
可能是一個操作系統(OS),也可能就是一個二進制程序。對于VMM來說,他就是一堆指令集,只需要知道入口(rip寄存器值)就可以加載。
Guest運行需要虛擬CPU,當Guest代碼運行的時候,處于VMX non-root模式,此模式下,該用什么指令還是用什么指令,該用什么寄存器還用什么寄存器,該用cache還是用cache,但是在執行到特殊指令的時候(比如Demo中的out指令),把CPU控制權交給VMM,由VMM來處理特殊指令,完成硬件操作。
3.CPU運行級別:
CPU支持ring0~ring3 4個等級,但是Linux只使用了其中的兩個ring0,ring3。當CPU寄存器標示了當前CPU處于ring0級別的時候,表示此時CPU正在運行的是內核的代碼。而當CPU處于ring3級別的時候,表示此時CPU正在運行的是用戶級別的代碼。當發生系統調用或者進程切換的時候,CPU會從ring3級別轉到ring0級別。ring3級別是不允許執行硬件操作的,所有硬件操作都需要內核提供的系統調用來完成。
4.VMX:
為了從CPU層面支持VT技術,Intel-V 在 ring0~ring3 的基礎上,擴展了傳統的x86處理器架構,引入了VMX模式,VMX分為root和non-root。VMM運行在VMX root模式;Guest運行在VMX non-root模式。
CPU虛擬化
有了cpu的運行級別和VMX,就可以看一下CPU虛擬化的基本運行情況了。
Guest OS里的內核運行于VMX non-root下的ring0
Guest OS里的應用程序運行于VMX non-root模式下的ring3
Host OS的內核和VMM運行于VMX root模式下的ring0。
雖然GuestOS的內核也運行于ring0,但是由于是non-root模式,所以不能操作某些資源,不能運行敏感指令。
Guest也分ring0~ring3,不過他并不感知自己處于VMX non-root模式下。
VMM與Guest的切換
1. VM entry 和 VM exit
Guest與VMM之間的切換有兩個過程:VM entry 和 VM exit。Guest運行時處于VMX下的non-root模式,當執行了特殊操作的時候(具體哪種操作后面的VM exit原因中會提到),通過VM exit將cpu控制權返回給VMM,從而陷入到root模式下的ring0內的VMM,進行“陷入模擬”。 VMM處理完特殊操作后再通過VM entry把結果和控制權返回給Guest。
2.導致VM exit的原因
導致VM exit的原因有多種,例如Guest執行了硬件IO訪問操作,或者Guest調用了VMCALL指令,或者調用了退出指令,或者產生了一個page fault,或者訪問了特殊設備的寄存器等。在內核中有關于VM exit原因的列表。
3.VMCS:(虛擬機控制結構)
這是虛擬機的戶口本,對虛擬機至關重要。Guest Exit的時候,會將當前Guest的上下文保存到VMCS中,Guest entry的時候把VMCS上下文恢復給VMM。VMCS是一個64位的指針,指向一個真實的內存地址,VMCS是以vCPU為單位的,即Guest有多少個vCPU,就對應多少個VMCS指針。VMCS的操作包括VMREAD,VMWRITE,VMCLEAR。
當Guest發起執行的指令處于VMX模式(包括運行VMM的root和運行Guest代碼的non-root)的時候,Guest不能判斷當前CPU是否處于VMX模式還是非VMX模式。當產生VM exit的時候,CPU會將exit reason保存到MSRs(VMX模式的特殊寄存器組),對應到KVM就是vCPU->kvm_run->exit_reason。VMM再根據exit_reason做相應的處理。所以MSRs寄存器就成了Guest和VMX交接的中間人。
總結
以上是生活随笔為你收集整理的Intel的cpu虚拟化的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: CLion在Mac破解
- 下一篇: 东方甄选淘宝首播定于8月29日,俞敏洪参