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