虚拟化的三种方式
- 全虚拟化 :将非内核态指令模拟成内核态指令再交给cpu处理,中间要经过两重转换,因此效率低,但优点是不会修改GuestOS,所以全虚拟化的VMM可以安装绝大部分操作系统,全虚拟化架构下的GuestOS运行在cpu的用户态(Ring 3),因此不能直接操作硬件设备。为解决这一问题,引入特权解除和陷入模拟机制。典型的全虚拟化软件:VMWare Hyper-V KVM-x86
- 半虚拟化:半虚拟化技术是需要GuestOS协助的虚拟化技术,因为在半虚拟化VMM中运行的GuestOS内核都经过了修改。一种方式是修改GuestOS内核指令集中包括敏感指令在呢诶的内核态指令,是HostOS在接收到没有经过半虚拟化VMM模拟和翻译处理的GuestOS内核态指令或敏感指令时,可以准确判断出该指令是否属于GuestOS,从而高效的扁面错误 另一种方式是在每一个GuestOS中安装特定的半虚拟化软件,如VMtools,RHEVTools。典型的半虚拟化软件如Xen,KVM-PowerPc等
- 硬件辅助虚拟化:由CPU直接支持的虚拟化技术,这种虚拟化技术引入了新的CPU运行模式和新的指令集,使VMM和GuestOS运行在不同的模式之下(VMM运行在Ring0的根模式下;GuestOS则运行在Ring0的非根模式下)目前主流的硬件辅助虚拟化技术有以下两种: Intel VT-x AMD-V
- 内存虚拟化:内存虚拟化的映射(内存地址转换)涉及到三类地址:
1,虚拟地址(VA):GuestOS提供给其他应用程序使用的线性地址空间
2,物理地址(PA):经过VMM抽象的,虚拟机看到的伪物理地址
3,机器地址(MA):真实的机器物理地址,即地址总线上出现的地址信号
宿主机到虚拟机的内存地址映射关系如下:GuestOS负责VA到PA的映射,PA=f(VA) VMM负责PA到MA的映射,MA=g(PA) - 总线虚拟化:总线虚拟化可以将一块网卡分给若干个GuestOS使用,每台虚拟机分得网卡性能的1/N,由于总线虚拟化是直接把物理设备分给GuestOS的 无需经过VMM,因此性能较高甚至接近于真机。内存虚拟化和总线虚拟化技术的实现,进一步提高了GuestOS和HostOS的运行性能,主流的总线虚拟化技术主要两类:Intel的VT-d技术 AMD的IOMMU技术
6.容器虚拟化:容器虚拟化不是一种硬件虚拟化方法,而是一种操作系统级的虚拟化方法,因而不属于全虚拟化和半虚拟化中任意一类。以容易为虚拟化的载体单位,容器可以为应用程序提供隔离的运行空间,且一个容器内的变动并不会影响其他容器。 容器比虚拟机更轻量,效率更高,部署快捷,但是容器将应用打包并以进程的形式运行在操作系统上,因此应用之间并非完全隔离,这是一大缺陷。