简单的活着

VMFUNC

Posted on By Mista Cai

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:

  1. Primary processor control,比如启用MSR/IO controls,cr3-load-exiting,cr3-store-exiting
  2. Secondary processor control,该field需要通过primary设置激活,用来启用EPT,VPID等。
  3. 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.

1.启用VM Functions