Intel Vt虚拟化笔记

  源码 + 手册 + 开发/应用。vt技术学习需要时间沉淀,去年学习保护模式对vt做了简单的学习,时间久了知识还是忘记了。
  源码使用ke_github开源代码,Intel手册19~31章,从0~1理解+编写代码,应用开发VT-EPT_API-Monitor。

  

学习方法:站在巨人的肩膀

  1. 19~31章节认真阅读理解,模块化片断写成代码,顺带锻炼英语阅读能力。
  2. 主要是理解思路,自己先依据手册写代码。以应用为导向,开发自己的vt api监控。

19章:

  1. IA-32扩展支持Virtual-machine monitors(VMM)/Guest software,VMM完全控制处理器和其他平台硬件,能够保留处理器资源,物理内存,中断管理和IO。来宾这里初略理解成节点虚拟机
  2. VMX两种,VMM运行在VMX root,Guest software运行在non-root,转换至VMX non-root叫做VM条目,VMX non-root转换到VMX叫做VMX exit.这个过程就像进门和出门两个概念。

了解VMM生命周期

  1. 软件进入VMX操作 用 VMXON指令

  2. 使用VM进入,利用VMLAUNCH VMRESUME进入Guest virtual machines,VM exit重新获取控制

  3. VM传输控制退出到VMM指定入口点,根据退出原因处理,vm条目返回虚拟机

  4. VMXOFF实现关闭离开虚拟机

Intel Vt虚拟化笔记

  VMX non-root 转换 VMX是 virtual-machine control structure(VMCS)控制,VMSC指针来访问结构体(64bit),分别使用VMPTRST/VMPTRLD读写结构,VMREAD/VMWRITE/VMCLEAR指令配置,软件进入VMX操作之前,必须支持VMX。

if(CPUID.1:ECX.VMX[bit 5] == 1)

{

  支持VMX

}

  通过CR4.VMXE[bit 13] == 1开启VMX,通过VMXON进入,如果VMXE==0会有触发异常

VMXON由IA32_FEATRUE_CONTROL_MSR控制.

  VMX限制操作,不可以处在A20模式,INIT信号会被阻塞,VMX需要CR0.PE/CR0.NE/CR0.PG/CR4.VMXE标志位为1,保护模式/分页模式才可以运行MVX操作,这说明来宾不可以在非分页模式下。
  本章组要介绍了VMM/VMX/Guest概念,VMX生命周期指令,重要的是VMX支持条件。

20章

  VMX非根操作,VMCLEAR/CMPTRLD/VMREAD/VMWRITE,每个处理器将内存中的一个区域,与VMCS关联,被称为VMCS regIon.通过64-bit 地址来引用,这就是VMCS pointer。
  必须在4kb的边界上对其指针(bit 11:0必须为0),VMPTRLD可以让VMCS活跃,还有介绍了一些其它指令和VMCS关联

Intel Vt虚拟化笔记

VMCS区域最多4kb,区域格式

Intel Vt虚拟化笔记

  VMCS前32Bit是revision identifier,不同的格式维护VMCS,使用VMCS之前需要填充VMCS revision identifier,如何与处理器标志版本不用,VMPTRLD则失败。
  记下来的32-bit则是abort indicator,这些位不会干扰处理器,如果发生了VMX中止,则执行这些位,这区域记录中止相关数据。
  剩下区域是VMCS数据,用来控制non-root VMX disecover VMX等,特定格式实现,明天继续。

VMCS

1) Guest-state area:

每个VM条目从这些字段加载处理器状态,并且存储在VM出口的字段中。

Register

控制寄存器 CR0,CR3,CR4 64-bit

调试寄存器 DR7 64-bit

RSP,RIP,RFLAGS 64-bit

CS,SS,DS,ES,FS,GS,LDTR,TR,关于段寄存器介绍

Non-Register
活动状态(32bit):
0 Active 时候处理器正常执
1 HLT 执行HLT指令,处理器不活动
2 Shutdown 处理不活动,三重故障 严重错误
3 Wait-for-SIPI 处理不活跃,等待IPI重启
可中断状态(32bit)

0 STL中断,STL设置的EFLAGS (IF-bit)RFLAGS.IF = 0

1 MOV SS 疑问:

2 SMI

3 NMI

31:4

等待异常调试(64-bit):

3:0 B3-B0 即使没有DR7支持,每一个位都可以标识

11:4 这个标志位保留,如果不是0 VM进入失败

12 bit开启断点

13 保留

14 BS 单步触发

63:15

VMCS link pointer(64bit) 设置成FFFFFFFF_FFFFFFFFH 避免进入VM失败

2) Host-state area:

从VM exits加载状态
CR0,CR3,CR4,RSP,RIP

Intel Vt虚拟化笔记

3) VM-execution control fields:

VM执行控制VMX non-root操作,决定了VM退出原因(一定程度)
构建32向量处理异步事件(比如中断)

基于引脚的VM执行

VMX non-root
0: 扩展中断退出,如果为1的话,VM外部中断则退出,否则交付至IDT。如果为1, RFLAGS.IF不影响。
3:NMI扩展,如果为1的话,非掩码中断导致VM退出
5:虚拟NML,如果为1意味着违背NMI阻塞。

基于处理器的VM执行
异常位图
I/O位图地址
时间戳偏移
Guest/Host CR0 CR4
CR3-Target Controls

  如果在VM non-root下执行MOV CR3不会导致VM退出,如果CR3目标计数为0,则会导致VM退出,目标计数大于4,VM条目失败,MSR IA32_VMX_MISC。VMCS-pointer用于管理中断SMI和系统管模式SMM。

4) VM-exit control fields: VM出口

生成32-bit向量,负责VM退出
9:主机地址空间大小,对于不持支Inetl 64必须为0
15: 退出时候确认中断

5) VM-entry control fields:VM入口

9 IA-32e mode guest
10 进入SMM
11 停用双重监控

6) VM-exit information fields

7) VM执行/退出/进入统称 VMX controls

访问VMCS需要遵循的规则

  1. 处理器是否提供VM exit 信息MSR IA32_VMX_BASIC来确定,不可以在多个逻辑处理器活动,
    MVCS迁移至另一个处理器,第一个处理器VMCS执行VMCLEAR,保证不活动且VMPTRLD之前。
  2. 应该使用VMREAD/VMWRITE来访问VMCS数据
  3. vm条目进入VMCS之前应该初始化全部条目

24章

System Management mode (SMM) Overvlew

  SMM是特殊的模式,如处理电源管理,系统硬件控制或专有的OEM设计代码,他供系统硬件使用,好处提供了独特易于隔离的处理器环境,透明的运行。
  当通过系统中断(SMI)调用SMM时候,保存处理器上下文,处理器切换到一个分离的地址控件,SMM指定代码透明执行,如磁盘未关闭之类的,SMI处理完成后,RSM指令使处理器重新加载已保存的上下文,切换回实际模式,回复执行中断的应用程序或任务。

  1. 进入SMM的唯一方法是SMI。
  2. 处理器执行SMM代码在单独的地址控件SMRAM,其它无权访问。
  3. 进入SMM,处理器保存被中断程序或任务上线文。
  4. 进入SMM,全部中断通常由操作系统处理禁用。
  5. RSM只能在SMM中执行。
  6. SMM处理中,不支持引入的物理扩展PAE机制。
  7. SMM像实模式一样,没有特权等级和地址映射。

    System management mode and Virtual-machine extensions Operation

      默认方式:系统固件处理SMI,处理器进入SMM时候保存VMX状态,SMI处理完成,使用RSM恢复VMX操作。
      双从监视器:两个VM监视器协同处理SMIs:一个VMM在SMM之外运行,为Guest 提供支持,另一个运行在SMM内部,支持系统管理功能

    System Management Interrupt(SMI)

    当处理器在SMM中SMI禁用状态:
      进入SMM,当接收到SMI,等地所有指令退出/存储完成,保存处理器上线文至SMRAM,进入SMM执行SMI处理程序。进入到处理器后,SMM处理器向外部发送信号告诉已开始处理SMM,SMI优先级最高

    SMRAM

      SMRAM映射到物理内存大小可达4GB,默认的64kb,30000H,SMBASE+8000H查找第一条SMI指令,将处理器状态存储在SMBASE+FE00H~SMBASE+FFFFH。

Intel Vt虚拟化笔记

百度相关文献的时候,发现一篇翻译SMM,发现自己英语太差了,所以学习翻译版该章节

https://blog.csdn.net/humanof/article/details/94621498

25章

  VMX系统编程概述,每一个VM就如一个完整的虚拟机,运行最特权级别,并拥有底层硬件所属权.VMM控制创建VM,管理VM与VM之间的转换情况,VMM允许VM共享底层硬件且隔离。

实模式的来宾模式:

  1. 通过VMM使用快速指令集仿真器
    Intel Vt虚拟化笔记

Intel Vt虚拟化笔记

  进入VMX之前必须申请一个VMXON区域,VMM通过IA32_VMX_BASIC MSR读取VMCS,使用4KByte对齐的物理内存区域创建此大小的VMCS区域,软件不能读取和写入VMCS区域。
  VMM通过VMPTRLD指令标识当前VMCS,只能通过VMREAD/VMWRITE进行VMCS读写操作。

Intel Vt虚拟化笔记

a) VMX处理和转换,从外部VMX操作VMXON,进入到根VMX操作,VM条目进入意味着根VMX转换到了非根VMX,VM 条目退出是从VMX non-root转换成VMX。

VMM安装和卸载

VMX之前需要确保分页下运行:

  1. 检测CPUID是否支持VMX
  2. 通过MSRs确认处理器支持VMX
  3. MSR指定IA32_VMX_BASIC大小非分页创建VMXON区域,对其至4kb边界。
  4. 软件读取MSR,确定可用的VMXON区域物理范围,VMXON必须托管在缓存相关内存中
  5. 初始化VMXON中的前32bit版本号
  6. 满足PE/PG=1,
  7. CR4.VMXE=1启用VMX操作,确保生成CR4值属于IA32_VMX_CR4_FIXDE0和FIXDE1固定值
  8. IA32_FEATURE_CONTROL MSR 却把bit(0) = 1;
  9. 使用EFLAGS.CF = 0/VMXON
    上述步骤完成,处理器出入VMX root中。

    准备和启动虚拟机

    VMM设置和启动Guest Vm步骤

  10. VMX能力MSR指定的大小不可分页的内存中创建一个VMCS区域IA32_VMX_BASIC并对齐到4KBytes
  11. IA32_VMX_BASIC初始化前32Bit
  12. 来宾-VMCS地址执行VMCLEAR结构,初始化内存中新的VMCS,且设置为清除。还需要检测RFLAGS.CF=0/RFLAGS.ZF=0
  13. VMCS地址执行VMPTRLD指令初始化工作
  14. 发出一系列VMWRITE用来初始化主机状态(各类的寄存器)。
  15. VM条目一致性检查

    处理VM出口

  16. VMREAD读取确定退出原因
  17. 有效资格提供了更多细节
  18. VMCS获取退出其它字段
  19. VMM适当处理退出条件。

    多处理器考虑:

  20. 对称VMM?---不对称VMM 指的CPU

26章系统资源虚拟化

  当VMM托管多个来宾时候,调试设施/地址转换/物理内存/微码更新设施,调试设施虚拟化支持,Inetl64和IA-32 提供了断点指令,异常条件,寄存器标志,调试寄存器,控制寄存器和存储缓冲区,调试系统软件。

  1. 可以对异常进行处理,如int3
  2. 可以像Gust注入异常
  3. DR0~DR7

    内存虚拟化

  4. VMM必须控制物理内存,确保物理隔离,重新映射主机与来宾之间的内存地址关系。
  5. 需要支持来宾虚拟化,包括所有模式,VMM可以利用分页结构来支持虚拟化内存。VMM可以再来宾和线性地址之间映射一个平面页表。
  6. VMX提供给VMM提供了VM完全监视(PAT/MSR/MTRR),VMM给VM提供连续的内存控件,从0开始直到VM支持的最大地址。
  7. 为了解决来宾软件可以随意的修改页表(VMM),所以活动页表和来宾页表结构可能有所不一,那么利用TLB可以解决这个问题。允许来宾自由访问页面目录和页表,陷阱发生在CR3访问和执行,INVLPG上,VMM维护了一个可供可选择的页表层次结构,VMM支持TLB。

28章

virtual-processor identfiers VIPDs,可以通过VPID来切换线性地址,VMX会保存缓存信息。
当前VPID为0的时候:

  • VMX root 操作
  • VMX 非root
    EPT使用的时候,来宾的物理地址通过遍历一组EPT分页来结果用于访问内存的物理地址。
  • 如果CR0.PG=0,每个线性地址将视为来宾地址
  • 如果CR0.PG=1,都是来宾分页派生的地址
  • 如果PG=1/CR4.PAE = CR4.PSE = 0

VM编程

1) 检测系统版本
2) 检测是否支持VMX
// See: DISCOVERING SUPPORT FOR VMX

Intel Vt虚拟化笔记

// See: BASIC VMX INFORMATION
// 开启VMX,CR4.VMXE =1 & 如果再BIOS上开启VMX还需要设置lock和1/2bit

Intel Vt虚拟化笔记

猜你喜欢

转载自blog.51cto.com/13352079/2545416