源码 + 手册 + 开发/应用。vt技术学习需要时间沉淀,去年学习保护模式对vt做了简单的学习,时间久了知识还是忘记了。
源码使用ke_github开源代码,Intel手册19~31章,从0~1理解+编写代码,应用开发VT-EPT_API-Monitor。
学习方法:站在巨人的肩膀
- 19~31章节认真阅读理解,模块化片断写成代码,顺带锻炼英语阅读能力。
- 主要是理解思路,自己先依据手册写代码。以应用为导向,开发自己的vt api监控。
19章:
- IA-32扩展支持Virtual-machine monitors(VMM)/Guest software,VMM完全控制处理器和其他平台硬件,能够保留处理器资源,物理内存,中断管理和IO。来宾这里初略理解成节点虚拟机
- VMX两种,VMM运行在VMX root,Guest software运行在non-root,转换至VMX non-root叫做VM条目,VMX non-root转换到VMX叫做VMX exit.这个过程就像进门和出门两个概念。
了解VMM生命周期
-
软件进入VMX操作 用 VMXON指令
-
使用VM进入,利用VMLAUNCH VMRESUME进入Guest virtual machines,VM exit重新获取控制
-
VM传输控制退出到VMM指定入口点,根据退出原因处理,vm条目返回虚拟机
- VMXOFF实现关闭离开虚拟机
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关联
VMCS区域最多4kb,区域格式
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
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需要遵循的规则
- 处理器是否提供VM exit 信息MSR IA32_VMX_BASIC来确定,不可以在多个逻辑处理器活动,
MVCS迁移至另一个处理器,第一个处理器VMCS执行VMCLEAR,保证不活动且VMPTRLD之前。 - 应该使用VMREAD/VMWRITE来访问VMCS数据
- vm条目进入VMCS之前应该初始化全部条目
24章
System Management mode (SMM) Overvlew
SMM是特殊的模式,如处理电源管理,系统硬件控制或专有的OEM设计代码,他供系统硬件使用,好处提供了独特易于隔离的处理器环境,透明的运行。
当通过系统中断(SMI)调用SMM时候,保存处理器上下文,处理器切换到一个分离的地址控件,SMM指定代码透明执行,如磁盘未关闭之类的,SMI处理完成后,RSM指令使处理器重新加载已保存的上下文,切换回实际模式,回复执行中断的应用程序或任务。
- 进入SMM的唯一方法是SMI。
- 处理器执行SMM代码在单独的地址控件SMRAM,其它无权访问。
- 进入SMM,处理器保存被中断程序或任务上线文。
- 进入SMM,全部中断通常由操作系统处理禁用。
- RSM只能在SMM中执行。
- SMM处理中,不支持引入的物理扩展PAE机制。
- 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。
百度相关文献的时候,发现一篇翻译SMM,发现自己英语太差了,所以学习翻译版该章节
https://blog.csdn.net/humanof/article/details/94621498
25章
VMX系统编程概述,每一个VM就如一个完整的虚拟机,运行最特权级别,并拥有底层硬件所属权.VMM控制创建VM,管理VM与VM之间的转换情况,VMM允许VM共享底层硬件且隔离。
实模式的来宾模式:
- 通过VMM使用快速指令集仿真器
进入VMX之前必须申请一个VMXON区域,VMM通过IA32_VMX_BASIC MSR读取VMCS,使用4KByte对齐的物理内存区域创建此大小的VMCS区域,软件不能读取和写入VMCS区域。
VMM通过VMPTRLD指令标识当前VMCS,只能通过VMREAD/VMWRITE进行VMCS读写操作。
a) VMX处理和转换,从外部VMX操作VMXON,进入到根VMX操作,VM条目进入意味着根VMX转换到了非根VMX,VM 条目退出是从VMX non-root转换成VMX。
VMM安装和卸载
VMX之前需要确保分页下运行:
- 检测CPUID是否支持VMX
- 通过MSRs确认处理器支持VMX
- MSR指定IA32_VMX_BASIC大小非分页创建VMXON区域,对其至4kb边界。
- 软件读取MSR,确定可用的VMXON区域物理范围,VMXON必须托管在缓存相关内存中
- 初始化VMXON中的前32bit版本号
- 满足PE/PG=1,
- CR4.VMXE=1启用VMX操作,确保生成CR4值属于IA32_VMX_CR4_FIXDE0和FIXDE1固定值
- IA32_FEATURE_CONTROL MSR 却把bit(0) = 1;
- 使用EFLAGS.CF = 0/VMXON
上述步骤完成,处理器出入VMX root中。
准备和启动虚拟机
VMM设置和启动Guest Vm步骤
- VMX能力MSR指定的大小不可分页的内存中创建一个VMCS区域IA32_VMX_BASIC并对齐到4KBytes
- IA32_VMX_BASIC初始化前32Bit
- 来宾-VMCS地址执行VMCLEAR结构,初始化内存中新的VMCS,且设置为清除。还需要检测RFLAGS.CF=0/RFLAGS.ZF=0
- VMCS地址执行VMPTRLD指令初始化工作
- 发出一系列VMWRITE用来初始化主机状态(各类的寄存器)。
- VM条目一致性检查
处理VM出口
- VMREAD读取确定退出原因
- 有效资格提供了更多细节
- VMCS获取退出其它字段
- VMM适当处理退出条件。
多处理器考虑:
- 对称VMM?---不对称VMM 指的CPU
26章系统资源虚拟化
当VMM托管多个来宾时候,调试设施/地址转换/物理内存/微码更新设施,调试设施虚拟化支持,Inetl64和IA-32 提供了断点指令,异常条件,寄存器标志,调试寄存器,控制寄存器和存储缓冲区,调试系统软件。
- 可以对异常进行处理,如int3
- 可以像Gust注入异常
- DR0~DR7
内存虚拟化
- VMM必须控制物理内存,确保物理隔离,重新映射主机与来宾之间的内存地址关系。
- 需要支持来宾虚拟化,包括所有模式,VMM可以利用分页结构来支持虚拟化内存。VMM可以再来宾和线性地址之间映射一个平面页表。
- VMX提供给VMM提供了VM完全监视(PAT/MSR/MTRR),VMM给VM提供连续的内存控件,从0开始直到VM支持的最大地址。
- 为了解决来宾软件可以随意的修改页表(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
// See: BASIC VMX INFORMATION
// 开启VMX,CR4.VMXE =1 & 如果再BIOS上开启VMX还需要设置lock和1/2bit