虚拟化实现—CPU虚拟化

经典的虚拟化方法:

现代计算机体系结构一般至少有两个特权级(即用户态和核心态,x86有四个特权级Ring0~ Ring3)用来分隔系统软件和应用软件。那些只能在处理器的最高特权级(内核态)执行的指令称之为特权指令,一般可读写系统关键资源的指令(即敏感指令)决大多数都是特权指令(X86存在若干敏感指令是非特权指令的情况)。如果执行特权指令时处理器的状态不在内核态,通常会引发一个异常而交由系统软件来处理这个非法访问(陷入)。经典的虚拟化方法就是使用“特权解除”和“陷入-模拟”的方式,即将Guest OS运行在非特权级,而将VMM运行于最高特权级(完全控制系统资源)。解除了Guest OS的特权级后,Guest OS的大部分指令仍可以在硬件上直接运行,只有执行到特权指令时,才会陷入到VMM模拟执行(陷入-模拟)。“陷入-模拟” 的本质是保证可能影响VMM正确运行的指令由VMM模拟执行,大部分的非敏感指令还是照常运行。

X86的虚拟化漏洞:

因为X86指令集中有若干条指令是需要被VMM捕获的敏感指令,但是却不是特权指令(称为临界指令),因此“特权解除”并不能导致他们发生陷入模拟,执行它们不会发生自动的“陷入”而被VMM捕获,从而阻碍了指令的虚拟化。具体X86下的敏感指令分类大致如下:

1、访问或修改机器状态或虚拟机状态的指令。

2、访问或修改敏感寄存器或存储单元的指令,比如访问时钟寄存器和中断寄存器。

3、访问存储保护系统或内存、地址分配系统的指令。(段页之类)

4、所有I/O指令。

其中的(1)和(4)都是特权指令,在内核态下执行时会自动产生陷阱被 VMM 捕获,但是(2)和(3)不是特权指令,而是临界指令。部分临界指令会因为Guest OS的权限解除执行失败,但是却不会抛出异常,所以不能被捕获,譬如:(3)中的VERW指令。

X86的虚拟化方法:

由于x86指令集中有十多条敏感指令不是特权指令,因此x86无法使用经典的虚拟化技术完全虚拟化。鉴于x86指令集本身的局限,长期以来针对x86的虚拟化实现大致分为两派,即以VMWare为代表的Full virtualization派和以 Xen 为代表的Para virtualization派,KVM即支持Full virtualization,也支持Para virtualization,后期重点支持硬件辅助虚拟化。两派区别主要在对非特权敏感指令的处理上,Full派采用的是动态的方法,即:运行时监测,捕捉后在 VMM 中模拟;而Para派则主动进攻,将所有用到的非特权敏感指令全部替换,这样就少掉了大量的陷入-> 上下文切换 -> 模拟 -> 上下文切换过程,获得了大幅的性能提升。

1、X86“全虚拟化”(指所抽象的VM具有完全的物理机特性,OS在其上运行不需要任何修改)

Full派秉承无需修改直接运行的理念,对“运行时监测,捕捉后模拟”的过程进行优化。该派内部之实现又有些差别,其中以VMWare为代表的基于二进制翻译 (BT) 的全虚拟化为代表, 其主要思想是在执行时将VM上执行的Guest OS指令,翻译成x86指令集的一个子集,其中的敏感指令被替换成陷入指令。翻译过程与指令执行交叉进行,不含敏感指令的用户态程序可以不经翻译直接执行。

2、X86“半虚拟化”(指需OS协助的虚拟化,在其上运行的OS需要修改)

Para派的基本思想是通过修改Guest OS的代码,将含有敏感指令的操作,替换为对VMM的超调用Hypercall,类似OS的系统调用,将控制权转移到VMM,该技术因Xen项目而广为人知。该技术的优势在于VM的性能能接近于物理机,缺点在于需要修改Guest OS(如:Windows不支持修改)及增加的维护成本,关键修改Guest OS会导致操作系统对特定hypervisor的依赖性,因此很多虚拟化厂商基于Xen开发的虚拟化产品部分已经放弃了Linux半虚拟化,而专注基于硬件辅助的全虚拟化开发,来支持未经修改的操作系统。

3、X86“硬件辅助虚拟化”

其基本思想就是引入新的处理器运行模式和新的指令,使得VMM和Guest OS运行于不同的模式下,Guest OS运行于受控模式,原来的一些敏感指令在受控模式下全部会陷入VMM,这样就解决了部分非特权的敏感指令的“陷入-模拟”难题,而且模式切换时上下文的保存恢复由硬件来完成,这样就大大提高了“陷入-模拟”时上下文切换的效率。

以Intel VT-x硬件辅助虚拟化技术为例,该技术增加了在虚拟状态下的两种处理器工作模式:根(Root)操作模式和非根(Non-root)操作模式。KVM运作在Root操作模式下,而Guest OS运行在Non-root操作模式下。这两个操作模式分别拥有自己的特权级环,KVM和未经修改内核的Guest OS运行在这两个操作模式的0环。这样,既能使KVM运行在0环,也能使Guest OS运行在0环,避免了修改Guest OS。Root操作模式和Non-root操作模式的切换是通过新增的CPU指令(VMXON,VMXOFF等)来完成。

硬件辅助虚拟化技术消除了操作系统的ring转换问题,降低了虚拟化门槛,支持任何操作系统的虚拟化而无须修改OS内核,得到了虚拟化软件厂商的支持。硬件辅助虚拟化技术已经逐渐消除软件虚拟化技术之间的差别,并成为未来的发展趋势。

核心技术原理: vCPU调度分配机制

从虚拟机系统的结构与功能划分可以看出,客户操作系统与虚拟机监视器共同构成了虚拟机系统的两级调度框架,如图所示是一个多核环境下虚拟机系统的两级调度框架。客户操作系统负责第2 级调度,即线程或进程在VCPU 上的调度(将核心线程映射到相应的虚拟CPU上)。虚拟机监视器负责第1 级调度, 即VCPU在物理处理单元上的调度。两级调度的调度策略和机制不存在依赖关系。VCPU调度器负责物理处理器资源在各个虚拟机之间的分配与调度,本质上即把各个虚拟机中的VCPU按照一定的策略和机制调度在物理处理单元上可以采用任意的策略来分配物理资源, 满足虚拟机的不同需求。VCPU可以调度在一个或多个物理处理单元执行(分时复用或空间复用物理处理单元), 也可以与物理处理单元建立一对一固定的映射关系(限制访问指定的物理处理单元)。

2 条回复 A 作者 M 管理员 E
  1. 例如使用一台服务器安装ovirt,服务器cpu为40核,内存为64G,在ovirt上创建了4台虚拟机,4台虚拟机的配置都为10核cpu和16G内存,这样就把服务器的实际资源已经占满了,是否还可以继续创建和启动新的虚拟机呢?

欢迎您,新朋友,感谢参与互动!欢迎您 {{author}},您在本站有{{commentsCount}}条评论