•
什么是虚拟化: 虚拟化是指将一台物理计算机虚拟化为一台或多台虚拟化计算机,每台虚拟计算机都拥有自己的虚拟硬件,来提供一个独立的虚拟机执行环境。
现有的虚拟机技术分类:
指令集虚拟 如Bochs和QEMU
硬件抽象级虚拟 如VMware、xen、Denali
操作系统级虚拟 linux VServer
库程序或者应用程序级虚拟 java 虚拟机
基于VMM的虚拟化分类:
完全虚拟化(full virtualization):
和物理平台完全同质,OS感知不到运行在,无需对OS内核作任何改动
软件辅助的完全虚拟化:基于优先级压缩和二进制代码翻译
硬件辅助的完全虚拟化:intel VT-x技术
半虚拟化(paravirtualization):
通过在源代码级别上修改指令以回避虚拟化漏洞,可以实现更高的性能
CPU虚拟化:
物理地址:由硬件总线地址决定的地址空间
线性地址:进程使用的地址空间,一般包含内核占用,用户占用,共享段,
代码段,数据段等
逻辑地址:程序直接使用的地址
逻辑地址--->(分段) -->线性地址 -->(分页)->物理地址
分段和分页中的权限保护:
段保护:
当前权限级别(CPL):CPL描述当前代码的权限,通过CS寄存器的0,1两个bit记录,通过这两位,将CS指向的代码分为4个特权级ring0--ring3
描述符权限级别(DPL):DPL表示段和门所具有的权限,表示该段如果被访问,CPL必须小于DPL的值
当CPL<=DPL时,代码被执行,否则,触发异常。异常会被特权代码捕获
页保护:
页表项,页目录表项中存在一个user/supervisor位,该位为0时,对应的CPL为0,1,2时,为特权页面,对应CPL=3时为用户页面
大多数系统都存在一些指令,这些指令只能在最高特权级执行,如果在非对应特权级上运行,就会引发一个异常,处理器会陷入最高特权级,交由相关代码处理。这种指令叫做特权指令。
存在一些指令,能够访问敏感资源,(CR FLAG TLB, IDT, GDT, LDT),这些指令叫做敏感指令,显然,特权指令全部属于敏感指令。
存不存在一些敏感指令,不需要最高级特权就可以执行,是决定该体系结构能否进行虚拟化的关键,X86平台存在这样的指令,所以不属于可虚拟化架构。
陷入再模拟:能够处理所有可虚拟化架构
解释执行:逐条翻译,性能很差
扫描与修补:将即将执行的代码段进行扫描,将不可虚拟化指令用JMP指令提前置换
二进制代码翻译:开辟很大的缓冲区,将客户代码全部翻译好后再逐条执行
在X86平台上实现虚拟化的最好方法:
陷入再模拟+扫描与修补
对于半虚拟化更简单,直接修改GUEST OS的产生敏感指令的代码,主动陷入到最高特权级hypervisor
IO虚拟化方式:
设备接口完全模拟
FE/BE模型,XEN将驱动分为前端驱动和后端驱动,前端驱动属于guest OS,后端属于driver domain