VMFUNC
简单解释如何使用多EPTP和VE处理。#VE(virtualization Exception)
EPT也叫SLAT(二级地址转译),正常PML4表存在CR3;EPT类似,EPTP也包含PML4表,用来GPA->HPA。
类似于page fault, EPT也有EPT violation和EPT misconfig(例如设置了保留位)。传统的EPT violation处理是通过VM EXIT,但是现代处理器(Broadwell开始)支持新的IDT异常-#VE,定义在IDT的向量20。在VMCS设置了相关了相关位以后,处理器会抛出异常而不是VMEXIT。
- Host,指的是VMM, aka VMX root mode
- Guest/kernel,指的是运行的客户机内核
Host提示:
- 处理器不支持#VE,则触发VM EXIT
- 处理器不支持VMFUNC,则通过VMCALL进行模拟
- #VE不会触发,如果
- 处理器正在处理别的异常
ve_except_info
里的except_mask
是非零值。
Guest提示:
- VMFUNC可以在用户空间执行
- VPID不能是0,因为Host在用,所以使用Processor number + 1.VPIDs用来控制处理器缓存。
VMCS
处理器主要提供了三个VMCS fields来处理VM-exit:
- Primary processor control,比如启用MSR/IO controls,cr3-load-exiting,cr3-store-exiting
- Secondary processor control,该field需要通过primary设置激活,用来启用EPT,VPID等。
- Pin based control
#VE设置和处理
- vcpu.c: 在
setup_vmcs()
设置VMCS fileds,设置VE_INFO_ADDRESS, EPTP_LIST_ADDRESS,VM_FUNCTION_CTL
,并在Secondary processor control启用VE和VMFUNC。 - vmx.asm:包含#VE handler (__ept_violation),然后处理中断,调用C handler __ept_handle_violation(vcpu.c).
- vcpu.c:通过#VE处理violation,检测到感兴趣的地址是调用VMFUNC,然后利用EPTP index执行VMFUNC。
VM Functions
VM function是可以不通过VM Exit,由VMX non-root引发的处理器操作。通过设置VMCS相关fields来启用和配置VM Functions。VMFUNC指令触发VM functions,由EAX的值选择被触发的VM Function。
目前支持的好像只有VM Function 0,EPTP switching.