导图社区 Vol3 -25- VMX非根操作
“VMX非根操作(VMX non-root operation),通常客户软件(虚拟机)将在这种环境下运行。 两种类型的操作之间的转换称作VMX转换,从根操作模式转换到非根操作模式称作VMX进入(VMX Entry),相反从非根操作模式转换到根操作模式称作VMX退出(VMX Exit)。
编辑于2022-09-16 17:10:37 上海Virtualize APIC Accesses 功能可以单独开启,此时它的作用仅仅是将Guest APIC访问的VM Exit从EPT Violaton改为了APIC Access,对Guest的APIC访问仍需要以Trap-and-Emulate方式实现。
VMCS 的数据区包含了VMX配置信息:VMM在启动虚拟机前配置其哪些操作会触发VMExit。VMExit 产生后,处理器把执行权交给VMM 以完成控制,
系统软件可以通过CPUID指令来判断处理器是否支持VMX,如果CPUID.1.ECX.VMX[bit5] = 1,那么当前处理器支持VMX,否则,当前处理器不支持VMX功能。
社区模板帮助中心,点此进入>>
Virtualize APIC Accesses 功能可以单独开启,此时它的作用仅仅是将Guest APIC访问的VM Exit从EPT Violaton改为了APIC Access,对Guest的APIC访问仍需要以Trap-and-Emulate方式实现。
VMCS 的数据区包含了VMX配置信息:VMM在启动虚拟机前配置其哪些操作会触发VMExit。VMExit 产生后,处理器把执行权交给VMM 以完成控制,
系统软件可以通过CPUID指令来判断处理器是否支持VMX,如果CPUID.1.ECX.VMX[bit5] = 1,那么当前处理器支持VMX,否则,当前处理器不支持VMX功能。
25 - VMX非根操作
概述
在虚拟化环境中,guest软件栈一般以非根模式运行在一个逻辑处理器上
这种操作模式的处理器行为与不处在虚拟化环境中的处理器行为相似,也有一些不同点
导致VM exits的指令
导致VM exit的指令不会得到执行,处理器状态也不会因为该指令而改变. 这样的VM exit称为Faults-like
VM Exit和Faults的优先级遵循以下原则
部分异常优先级高于VM exits.此类异常发生时,VM不退出
在取指令操作数时发生的Faults比VM exit优先级高
由INS/OUTS指令执行导致的VM exits比以下Fault优先级高
由相关无法使用的段导致的GP fault
由于偏移地址超出段Limit导致的GP fault
对齐检查异常
除上面提到的情况,Fault-like VM exit的优先级都高于异常
在判断指令是否有可能导致VM exits时,一般假设该指令不会引发优先级高于VM exit的异常
导致VM无条件Exit的具体指令(运行在非根模式)
CPUID, GETSEC,INVD, XSETBV
常规指令
INVEPT, INVVPID,VMCALL,2 VMCLEAR, VMLAUNCH, VMPTRLD, VMPTRST, VMRESUME, VMXOFF, VMXON.
VMX指令
导致VM有条件(基于VM execution control的设置)Exit的具体指令
这部分指令很多,用到时查看Vol3-25.1.3节
导致VM exits的事件
异常
exception bitmap
Triple fault
调用double-fault时产生异常
External interrupts.
特殊设置bit为0/1时情况不同
Non-maskable interrupts (NMIs).
特殊设置bit为0/1时情况不同
INIT signals.
本身导致
Start-up IPIs (SIPIs). SIPIs cause VM exits
非正常操作导致
Task switches.
本身导致
System-management interrupts (SMIs).
dual-monitor treatment
VMX-preemption timer.
计时器count到0导致
一大类,基于controls的VM exit情况判定
无限制GUEST
支持VMX操作的第一代处理器需要CR0.PE和CR0.PG为1,即GUEST软件不能运行在非paged保护模式或者实模式,后来增加了一个控制位叫做"unrestricted guest",如果为1,那么non-root模式的PG和PE可以为0,允许guest软件运行在非paged保护模式或者实模式.
以下项描述了这类软件的行为
MOV CR0指令不会导致#GP异常,因为将会设置CR0.PE和CR0.PG为0
逻辑处理器在VMX non-root模式对待PE和PG跟处理器在VMX外部对待这二者一样
处理器操作与在正常VMX non-root模式下使能了PG或者PE没有区别
如果PG=0,page faults不会发生,便也不会导致VM Exits
如果PE=0, invalid-TSS异常不会发生,便也不会导致VM Exits
如果PE=0,以下指令导致invalid-opcode异常,但不导致VM Exits
见25.6最后一节
如果PG=0,每个线性地址会被直接传送到EPT用于翻译成物理地址的机制中. 传送给EPT机制的GUEST memory类型为WB(writeback)
VMX非根模式下的特性
VMX-Preemption Timer(VMX抢占时钟)
计时器count到0则发生VM exit,与TSC频率相同
可运行在多种状态
C-State: C0,C1,C2
shutdown 、 wait-forSIPI states
count到0时只要不在wait for SIPI状态 , 处理器就会转到C0状态,然后VM exit
比C2更深的状态下计数器不会递减
SMM和SMI下对待该Timer
如果SMI和SMM的默认对待被激活,那么该count将跨越从VMX non root 模式收到SMI进入SMM到退出SMM整个过程,如果该过程中计数结束,除非它被基于活动状态而阻塞了,否则,计时器诱发的VM Exit会在RSM之后以其正常优先级退出。
如果SMI和SMM为dual-monitor对待,那么进出SMM的方式分别为VM Entry和VM Exit,该计时器的处理将和默认的VM Exit/entry对该计时器的处理大体一样
Monitor Trap Flag(监视器陷阱标志)
调试功能,可以在VMX non-root模式下的指令边界引发VM exits, 这种退出称为MTF VM exits
如果“monitor trap flag” VM-execution control is 1,并且VM Entry正在注入矢量事件,则MTF VM Exits在VM Entry之后,第一条指令之前的指令边界上,处于pending状态。
如果VM Entry正在注入待处理的MTF VM Exit,则MTF VM Exit在VM入口之后,第一条指令之前的指令边界pending。即使“monitor trap flag” VM-execution control is 0,也是如此。
如果“monitor trap flag” VM-execution control is 1,VM entry未注入事件,并且在执行指令之前传递了未决事件(如调试中断和异常),则MTF VM Exit将在事件交付后的指令边界.
假设monitor trap flag” VM-execution control is 1,VM entry未注入事件,并且VM entry后的第一条指令是REP前缀的字符串指令,则会有以下情况
1. 如果第一次迭代上出现错误,则MTF exit在交付错误后的指令边界上pending
2. 如果第一次迭代未出现错误,MTF VM Exit在该迭代之后的第一个指令边界上pending
假设“monitor trap flag” VM-execution control is 1,VM entry未注入事件,且VM Entry之后的第一个指令为XBEGIN,这种情况下,MTF VM Exit在XBEGIN的后备指令地址处pending.无论是否已启用RTM事务区域的高级调试,该行为都适用.
假设“monitor trap flag” VM-execution control is 1,VM entry未注入事件,并且VM entry之后的第一条指令既不是REP前缀的字符串指令,也不是XBEGIN指令,则会有以下情况
如果该指令导致错误,MTF Exit在交付错误后的指令边界上pending
如果没有导致错误,则MTF Exit在该指令执行后的指令 边界上pending,根据指令的不同有所不同
如果在到达指令边界之前发生VM Exit,则不会发生MTF Exit.
除非有较高优先级的事件或由于活动状态导致MTF VM Exit被阻塞,否则MTF VM Exit总是发生.
优先级排序:INIT信号(SMI) > MTF VM Exit > 调试陷阱异常
导致MTF VM Exit被阻塞的活动状态: 关闭状态、等待SIPI状态
使用EPT翻译GUEST物理地址
细节
EPT(扩展页表)是一个能用以支持物理存储虚拟化的特性.
使用EPT时,某些物理地址被视为GUEST物理地址,并且不用于直接访问内存,而是通过遍历一组EPT分页结构来转换GUEST物理地址,以生成用于访问内存的物理地址.
Intel PT使用的地址被视为GUEST物理地址,包括输出区域地址和包含输出区域地址的ToPA入口的地址.
跟踪输出过程对访问的转换可能会导致违反EPT或EPT配置错误,从而导致VM Exit。
跟踪输出过程导致的EPT冲突始终导致VM Exit,并且永远不会转换为虚拟化异常
如果没有发生EPT冲突或EPT配置错误,并且启用了页面修改日志记录,则可以将输出区域的地址添加到页面修改日志中。
果日志已满,则会发生页面修改logfull事件,从而导致VM Exit。
如果 “virtualize APIC accesses” VM-execution control is 1,则跟踪输出过程使用的GUEST物理地址可以转换为APIC访问页面上的地址。 在这种情况下,跟踪输出过程的访问会导致APIC访问VM Exit.
追踪地址预翻译(TAPT)
防止Intel PT产生的追踪数据丢失
如果VM Exit禁用Intel PT,就会造成数据丢失
必须在输出页留有足够的空间用于缓冲数据
VM功能
可以在不使用VM Exit的情况下使用VM功能
VM功能由VMCS中不同字段的设置启用和配置
VMX non root操作下,软件使用VMFUNC调用VM函数,EAX选择特定VM功能
使能VM功能
软件通常通过设置“enable VM functions” VM-execution control来启用VM功能。 通过设置相应的VM功能control,可以启用特定的VM功能。
例如,假设该软件想要启用EPTP切换(VM功能0)。为此,它必须设置“activate secondary controls” VM-execution control (基于主处理器的第31位),“enable VM functions” VM-execution control (基于辅助处理器的VMexecution控件的位13)和 “EPTP switching” VM-function control(VM功能控件的位0)。
VMFUNC指令的一般操作
如果 “enable VM functions” VM-execution controls 为01或EAX的值大于63(只能启用VM功能0–63),则VMFUNC指令会导致无效操作码异常(#UD)。否则,如果VM功能control中EAX位置的位为0,则该指令将导致VM Exit(未启用所选的VM功能)。
如果发生此类VM Exit,则使用的基本退出原因为59(3BH),表示“ VMFUNC”,并且VMFUNC指令的长度保存在VM-exit指令长度字段中。
如果该指令既不会导致无效的操作码异常,也不会由于禁用的VM功能而导致VM Exit,则它将执行EAX中的值指定的VM功能。各个VM功能可能会执行其他故障检查(例如,如果CPL> 0,则可能会导致常规保护异常)。此外,特定的VM功能可能包括可能导致VM Exit的检查。如果发生此类VM Exit,则如前一段所述保存VM Exit信息。 VM功能的规范可以指示提供了其它VM退出信息。
EPTP切换
VM功能的0号功能
此VM功能允许VMX非根操作中的软件为EPT指针(EPTP)加载新值,从而建立不同的EPT 页结构层次。 软件仅限于从VMX root操作中由软件预先配置的有可能使用的EPTP值列表中进行选择。
具体来说,ECX的值用于从EPTP列表中选择一个entry,该EPTP列表地址引用了4 KB结构,因为此结构包含512个8字节entries,所以如果ECX≥512,VMFUNC会导致VM exit。 如果所选entry是有效的EPTP值,它将存储在当前VMCS的EPTP字段中,并用于使用GUEST物理地址的后续访问。
执行EPTP交换VM功能不会修改任何寄存器的状态; 没有标志被修改。
如果 “Intel PT uses guest physical addresses” VM-execution control is 1 ,且IA32_RTIT_CTL.TraceEn = 1,任何执行EPTP切换VM功能都会导致VM Exit。
APIC虚拟化
是一系列功能,用于支持中断和APIC的虚拟化
开启APIC虚拟化后,处理器会模拟对APIC的多次访问, 跟踪虚拟APIC的状态,并提供虚拟中断
运行在VMX non root模式
虚拟化异常(#VE)
平时导致VM Exit的情况将会导致#VE
可转换的EPT违规
如果“EPT-violation #VE” VM-execution control is 1,那么部分EPT违规操作会导致#VE而不是VM Exit,这样的EPT违规操作称为可转换的EPT
某些EPT页结构的entries决定哪种EPT违规为可转换的,一些EPT页结构的entry决定镇压(suppress) #VE
如果一个EPT页结构的entry的bit2:0均为0,那么该条目不存在. 如果在翻译GUEST物理地址时遇到这样一个条目,就会发生EPT违规. 该EPT违规为可转换的当且仅当该条目的bit63为0.
如果EPT页结构条目存在,则适用以下情况:
如果处理器不支持EPT页结构的值,则该条目配置错误。如果处理器在翻译GUEST物理地址时遇到此类条目,则会导致EPT配置错误(不是EPT违规)。 EPT配置错误总是会导致VM EXIT
如果处理器支持EPT页结构条目的值,则适用以下情况:
如果条目的第7位为1,或者如果条目为EPT PTE,则该条目映射一个页。如果处理器使用这样的条目来转换GUEST物理地址,并且如果对该地址的访问导致EPT违规,则仅当该条目的位63为0时,才可以转换EPT违规。
如果条目的第7位为0,并且该条目不是一个EPT PTE,则该条目参考另一个EPT页结构.处理器不使用该条目的bit 63决定随后的EPT违规是否为可转换的.
如果对GUEST物理地址的访问导致了一个EPT违规,那么用来翻译该地址的EPT结构条目用来决定该EPT违规是否为可转换的,用于翻译该地址的EPT结构条目为不存在的条目(如果GUEST物理地址未转换为物理地址)或用于映射页的条目.
如果满足以下条件,可转换EPT违规就会引发虚拟异常#VE
CR0.PE=1
逻辑核不在通过IDT交付事件的过程中
EPT违规是由IPT的输出处理造成的
虚拟异常信息区域中偏移量4为的32位全为0
交付#VE时,将全1写入虚拟异常信息区域中偏移为4的32bits,因此一旦一个虚拟异常发生,下一个虚拟异常需要发生时,软件必须先clear上一个虚拟异常的这些bit
虚拟异常信息
虚拟异常将相关信息存储到虚拟异常信息区域
虚拟异常信息区域
偏移0
32bit值,本来要存储到VMCS中,用于展示VM exit原因,对于EPT违规,该值为0x30
偏移4
FFFFFFFFH
偏移8
64bit值,本来要存储到VMCS中,用于展示VM Exit资质
偏移16
64bit值,本来要存储到VMCS中,作为GUEST线性地址
偏移24
64bit值,本来要存储到VMCS中,作为GUEST物理地址
偏移32
当前EPTP的index VM-执行控制值,16bit
虚拟异常的交付
存储完虚拟异常信息之后,处理器对待虚拟异常像对待其它异常一样
如果VMCS中的异常bitmap的bit20为1,则该虚拟异常导致VM Exit; 如果为0,则使用IDT中的门描述符20交付
虚拟异常不产生错误码,虚拟异常的交付不在栈中产生错误码
如果交付虚拟异常时遇到了一组串联的fault,为贡献性或页fault,#DF异常就会产生
如果一个#VE直接导致了一个VM Exit(因为异常bitmap的bit20为1),异常信息将存储在VMCS中的VM exit中断信息域中。但该事件是作为一个硬件异常利用vector20报告的,并且没有错误码. 该域的bit12正常设置.
如果一个#VE间接导致了一个VM Exit(因为异常bitmap的bit20为0,异常交付产生了一个导致VM Exit的事件),有关该异常的信息存储于VMCS的IDT-vectoring信息域,该事件是作为一个硬件异常利用vector20报告的,并且没有错误码.
VMX非根模式下指令行为的变化
部分变化是由特定VM-execution control导致的
具体可查看Vol-3-25.3
事件阻塞
外部中断control为1时,IF标志位不控制外部中断的阻塞
外部中断control为1时,无法确定STI和MOV SS能否对外部中断阻塞
NMI退出control为1时,无法确定STI和MOV SS能否对NMI阻塞
根据实现确定行为
任务切换
VMX非根模式不允许存在任务切换,如果发生则会导致VM Exit
但是可以有一些检查可以使用,可能会在VM EXIT之前引起fault
如果使用task gate,会基于相关优先级域对P位进行检查
对新的TSS selector进行检查
读取新的TSS描述符
基于切换类型对TSS描述符进行合适的检查,检查P、S、limit
只有这些检查(按顺序)都通过,才会发生VM Exit