VMX
分为root模式和non root模式,
VMCS通过VMPTRST,VMPTRLD修改。
VMREAD,VMWRITE修改VMCS内容。
VMXON,VMXOFF打开关闭VMX。
VMLAUNCH,VMRESUME
VMCS状态的状态管理?
VMPTRLD,转化为active,current
active,current
VMCS的几个区域:
1.Guest-state area
2.Host-state area
3.VM-execution cotrol fields
4.vm-exit control fields
5.vm-entry cotrol fields
6.vm-exit information fileds
Intel寄存器说明:
IDTR:中断描述表指针
GDTR:全局段描述表指针
LDTR:局部段描述表指针
segment selector:包含index,LDTorGDT,访问权限。
CS,SS,DS,ES,FS,GS
TSS段:TSS段的作用。TR寄存器指定。
RSP RIP PFLAGS 栈指针,代码段指针,标示位。
EAX,EBX,ECX,等通用寄存器。
CR0,CR1,CR3,CR4等控制寄存器。CR3指向页表。
那些寄存器需要保留: 理论上需要保留所有的状态信息,以便虚拟机退出再进入的时候,可以正常运行。
实际上硬件VMCS会自动保存和恢复哪些寄存器呢?
CR0,CR3,CR4
RSP RIP PFLAGS
LDTR
TR
GDTR
IDTR
MSR:
CS, SS, DS, ES, FS, GS
CR1,CR2为什么不保留?
CR2保存的是导致缺页中断的线性地址,CR1目前没有使用。
有哪些寄存器,硬件没有自动保存呢?
EAX,EBX,ECX,等通用寄存器。
为什么硬件没有自动保存呢?
因为这些是通用寄存器,需要通过这些寄存器,通过软件来模拟某些某些指令。
vmx_vcpu_run中的处理:
asm(
/* Store host registers */
"push %%" _ASM_DX "; push %%" _ASM_BP ";"
"push %%" _ASM_CX " \n\t" /* 在Host OS的栈中保存一个空间,当vm exit的时候,先保存cx到栈上 */
"push %%" _ASM_CX " \n\t" //保存hostos当前的寄存器信息到内核栈中
"cmp %%" _ASM_SP ", %c[host_rsp](