Intel VT-x入门

笔者笔记本是amd的cpu(悲)

mov eax,0

cpuid

vt支持检测

  1. cpuid指令
  • eax置1 指向cpuid
  • 查看ecx第五位,为1支持,0不支持
  1. MSR address 3AH:IA32_FEATURE_CONTROL ==1
  • image-20240409224050942
  1. CR0 PE(Protection Enable bit 0),PG(Paging bit 31),NE(Numeric Error bit 5) 开启
  2. CR4 VMXE位
  • 表示系统是否进入VT模式,进入VT模式前需要手动置1,否则会触发保护异常,且退出VT模式前无法更改该标志位。

大致流程

VMXON:启动vmx模式,此时cpu处于root模式(Hypervisor模式)

VMClear:使一块vmcs变为非激活状态,更新当前vmcs指针为空

VMPtrld:激活一块vmcs,将当前处理器vmcs指针设置为该物理地址

VMLaunch: 从root模式到non-root模式,转到Guest Os #VMEntry

产生Hypervisor感兴趣事件/GuestOs调用VMCALL指令会#VMExit到root模式

VMResume:Hypervisor处理完调用VMResume #VMEntry到 non-root模式下的Gusest Os

VMClear:使一块vmcs变为非激活状态,更新当前vmcs指针为空

VMXOFF:关闭vmx模式

image-20240411235329172

VMCS初始化

virtual-machine control data structures

VMREAD和VMWRITE指令来操作

VMCS区域

  1. Guest-State Area:#VMentry加载虚拟机处理器信息,#VMExit时保存处理器信息
  2. Host-State Area :#VMExit时加载处理器信息,#VMentry保存虚拟机信息
  3. VM-Control Fields
    1. VM-Execution Control Fields:用于控制虚拟机行为,例如中断方式,是否启用EPT,启用I/O端口,MSR访问限制等等。
    2. VM-Exit Control Fields:#VMExit发生时需要做的事情
    3. VM-Entry Information Fields:控制从host进入guest时的行为
  4. VM-Exit Information Fields:只读区,#VMExit事件相关信息

EPT(Extended Page Table)机制

用于实现内存虚拟化,将guest的物理地址Guest Physical Address, GPA,转换成host的物理地址Host Physical Address, HPA

EPT采用了9-9-9-9-12分页,EPTP字段指向最初的页表基址物理内存

Guest将VA转换GPA时还是要借助CR3寄存器来查各个页表基址,这些基址都是GPA,所以每一次都需要通过EPT基址转换位HPA

image-20240413194757029

参考

https://space.bilibili.com/37877654/channel/seriesdetail?sid=1467294