文章目录
- CPU虚拟化
- 特权级压缩
- 权限
- 系统虚拟化
- 解决方法
- 模拟&解释执行(VMware)
- 扫描&修补
- 二进制翻译(Binary Translation)
- 二进制代码翻译技术与扫描修补技术区别
- 硬件辅助虚拟化技术(VT)
- VMX操作模式(Virtual Machine eXtensions)
- **模式切换行为的定义**
- 分级保护
- VMCS(Virtual-Machine Control Structure)
- MSR
- VMX操作模式整体流程
- KVM&QEMU-KVM (Kernel-based Virtual Machine )
CPU虚拟化
CPU 是计算机中最核心的组件,直接控制着整个系统的运行,同时内存访问(内存虚拟化)与 I/O 操作(I/O 虚拟化)也都直接依赖于 CPU,因此 CPU 虚拟化是系统虚拟化技术中的核心
特权级压缩
VMM为最高权级,Guest VM在低权级,当Guest VM执行非敏感指令时是直接在硬件上执行的,当执行敏感指令时,会陷入最高权级的VMM,然后又VMM执行敏感指令的行为
权限
内核在ring 0,用户进程在ring3
系统虚拟化
在系统虚拟化的「Trap & Emulate」架构中,Gust OS全部运行在ring3。当VM涉及到特权指令时,VM触发General Protection 异常,然后VMM介入处理。
但并不是所有敏感指令都是特权指令,所以部分敏感指令虽然不是特权指令,而这些指令不会触发General Protection 异常从而让VMM介入,此时就比较危险了。
解决方法
模拟&解释执行(VMware)
模拟本质:实现被模拟对象相同行为但在不同平台的效果
模拟技术:模拟器不断从内存中读取指令,并模拟处每条指令的效果,然后再决定是否改变状态 (即解释执行)
QEMU(Quick Emulator )模拟器:完整模拟了一套包括各种硬件在内的计算机系统
模拟技术缺点:性能极差,每条指令都要模拟,模拟步骤繁琐
扫描&修补
虚拟机和物理机指令系统基本相同,没有必要纯模拟。
只是对于特权和敏感指令,通过某种方式转换到VMM
扫描&修补:让所有敏感指令替换为跳转指令等能陷入VMM的命令
基本流程:
- VMM在VM执行每段代码之前对其扫描,解析每条指令,查找敏感指令和特权指令
- VMM动态生成对应指令的补丁代码,将敏感指令和特权指令替换为外跳转以进入VMM,VMM执行补丁代码
- VMM执行补丁代码后,再跳转回VM继续执行下一条代码
二进制翻译(Binary Translation)
类似扫描&修补技术,二进制翻译技术同样会动态地修改代码,不过不同的时BT技术以基本块(只有一个入口和一个出口的代码块)作为翻译的单位
- 模拟器此时会对二进制代码翻译输出为不包含特权指令和敏感指令的指令集所构成的代码,该代码可以在VM下安全运行
- 模拟器动态地为当前基本块开辟一块空间,称为翻译缓存(translation cache),该空间存放着翻译后的代码,每一块翻译缓存与原代码存在某种映射关系
翻译方法
- 简单翻译:用其他代码实现等效的功能。但指令数量会增加(少数)
- 等值翻译:原代码和翻译后的代码一样。(大多数)
二进制代码翻译技术与扫描修补技术区别
硬件辅助虚拟化技术(VT)
这个是Intel为虚拟化提供的一个硬件支持,其中复制CPU虚拟化的叫做VT-x技术。
VMX操作模式(Virtual Machine eXtensions)
- VMX Root Operation:VMM的工作模式,能访问
所有资源,并调度VM - VMX Non-Root Operation:VM的工作模式,在这个模式下仅能访问非敏感资源,对于敏感资源访问会使得CPU退出Non-Root模式并进入VMX Root Operation模式中,在该模式下处理完后再重新进入VMX Non-Root Operation模式
模式切换行为的定义
- VM-Entry:VMM保存自身状态的信息,切换到VMX Non-Root Operation模式,加载VM的状态信息,恢复VM执行流
- VM-Exit:VM运行停止并保存自身状态的信息,切换到VMX Root Operation模式,加载VMM状态信息,执行相应的处理函数
分级保护
VMX Root Operation和VMX Non-Root Operation都有各自的分级保护, Host OS 与 Guest OS可以在自己对应的模式下直接在硬件上运行,仅仅当Guest OS涉及到敏感资源的访问及HOST OS对VM调度时会切换。
VMCS(Virtual-Machine Control Structure)
VMCS是保存虚拟机的虚拟CPU的相关状态的一块内存,每个virtual CPU都有一个VMCS,同一时刻物理CPU只能和一个VMCS绑定,即一个物理CPU对应一个虚拟CPU,但不同时刻可以将VMCS绑定到不同物理CPU上,即一个虚拟CPU可以选择对应的物理CPU,称为VMCS的迁移
VMCS与物理CPU的绑定与解绑
VT-x中将VMCS结构体定义为一个最大不超过的4KB的内存块,且与4KB对齐(即对应十六进制地址的低三位为0)
struct VMCS {
/* 版本号,4字节 */
uint32_t vmcs_revision_identifier:31, shadow_vmcs_indicator:1;
/* 中止标识,4字节
* 当 VM-Exit 失败时便会产生 VMX 中止,并在此处存放原因
*/
uint32_t vmx_abort_indicator;
/* 数据域 */
struct VMCSData vmcs_data;
};
数据域 struct VMCSData vmcs_data 存放着VMCS的主要信息,可分为以下几个部分
数据域的内容分布图
- Guest-state area:保存着VM模式寄存器状态,在VM-Entry时加载,在VM-Exit时保存
- Host-state area:保存着VMM模式寄存器状态,在VM-Exit时加载,在VM-Entry时保存
- VM-execution control fileds:控制VM模式下的处理器行为
- VM-entry control fileds:控制VM-Entry过程的某些行为
- VM-exit contro fileds:控制VM-Exit过程中的某些行为
- VM-exit information field:保存VM-Exit的基本原因及其他详细信息,在一些处理器该域为只读域
读写VMCS
这里的索引不是偏移值,而是Intel为数据域中每一个字段都定义了一个独特的索引值。
MSR
Model Specific Register,简称 MSR,是 x86 下的一组寄存器,里面有的寄存器用来控制 CPU 运行、有的记录功能开关、有的负责调试、有的监测 CPU 性能等等,但总体分为两类。如图
VMX操作模式整体流程
VMX模式默认时关闭的,只有当VMM需要使用硬件辅助虚拟化功能的时候才会打开,打开后才会有VM-root-operation和VM-no-root-operation这两种模式。
VMXON:开启VMX操作模式
VMXOFF:关闭VMX操作模式
resume和launch
KVM&QEMU-KVM (Kernel-based Virtual Machine )
本质相当于QEMU是主机,VMM在内核中
KVM负责CPU和内存的虚拟化,QEMU则负责模拟IO设备等硬件
在 linux 中可以使用 ioctl() 函数实现用户程序与内核模块通信
- QEMU通过ioctl系统调用发送某种请求使得进入内核态并将控制权给KVM然后运行VM
- 运行虚拟机代码时产生VM-Exit,随后KVM接管处理判断原因,处理完后决定是继续运行还是交由QEMU处理
- 如果需要IO操作,则需要退出KVM,由QEMU处理
QEMU-KVM详解