虚拟化、CPU虚拟化、内存虚拟化、设备和I/O虚拟化
对于业界标准的x86系统,虚拟化采取hosted或者hypervisor架构。
hosted架构将虚拟化层以一个应用程序的方式安装运行于操作系统之上,支持最为广泛的各种硬件配置。
hypervisor(裸金属)架构将虚拟化层直接安装到干净的x86系统上,由于它不需要通过操作系统而直接访问硬件,hypervisor架构相对于hosted架构效率更高,且具有更好的可扩展性、健壮性和性能。
VMware Player, ACE, Workstation和Server使用了hosted架构的便捷性,
而ESX server针对已认证的硬件采用hypervisor架构以达到数据中心级别的性能。
x86操作系统被设计成直接运行在硬件上,自然这些系统会认为它们拥有硬件的全部控制权。
x86架构为操作系统和应用程序提供了四个不同级别的权限来管理对硬件的访问,分别为ring 0,1,2和3。
用户程序一般运行在ring 3,操作系统需要直接访问内存和硬件,因此需要在ring 0执行它的特权指令。
x86架构的虚拟化需要在操作系统(运行于最高权限的ring 0)之下放置一个提供共享资源的虚拟化层来创建和管理虚拟机。VMware在1998年就攻克了这个挑战,开发了二进制翻译技术使得VMM运行在ring 0以达到隔离和性能的要求,而将操作系统转移到比应用程序所在ring 3权限高和比虚拟机监控器所在ring 0权限低的用户级。
目前有三种技术来实现x86架构CPU敏感指令和特权指令的虚拟化,分别为:
. 使用二进制翻译的全虚拟化;
. 操作系统辅助或半虚拟化;
. 硬件辅助的虚拟化(第一代);
使用二进制翻译的全虚拟化:
使用二进制翻译和直接指令执行相结合的技术,VMware可以虚拟化任何基于x86的操作系统。
操作系统辅助虚拟化或半虚拟化:
半虚拟化指的是虚拟机系统和hypervisor通过交互来改善性能和效率。半虚拟化涉及到修改操作系统内核来将不可虚拟化的指令替换为直接与虚拟化层交互的超级调用(hypercalls)。hypervisor同样为其他关键的系统操作如内存管理、中断处理、计时等提供了超级调用接口。全虚拟化时未经修改的虚拟机系统不知道自身被虚拟化,系统敏感的调用陷入后再进行二进制翻译。半虚拟化的价值在于更低的虚拟化代价,但是半虚拟化相对全虚拟化的性能优势根据不同的工作负载有很大差别。半虚拟化不支持未经修改的操作系统(如Windows 2000/XP),因此它的兼容性和可移植性较差。由于半虚拟化需要系统内核的深度修改,在生产环境中,半虚拟化在技术支持和维护上会有很大的问题。开源的Xen项目是半虚拟化的一个例子,它使用一个经过修改的Linux内核来虚拟化处理器,而用另外一个定制的虚拟机系统的设备驱动来虚拟化I/O。
硬件辅助的虚拟化:
第一代技术包括Intel虚拟化技术(VT-x)和AMD的AMD-V,两者都针对特权指令为CPU添加了一个执行模式,VMM运行在ring 0,同时在新增的根模式下。
内存虚拟化
除了CPU虚拟化之外,下一个关键的组件是内存虚拟化。内存虚拟化涉及到对系统物理内存的共享和动态地为虚拟机分配内存。内存虚拟化和当代操作系统对虚拟内存的支持类似。应用程序看到的连续地址空间和底下真正的物理内存不一定是一一对应的。操作系统保存了虚拟页号到物理页号的映射。当前所有的x86 CPU包含了一个内存管理单元(MMU)和一个旁路缓冲(TBL)以优化虚拟内存的性能。
为了在一个系统上运行多个虚拟机,还需要另外一层的内存虚拟化。也就是说,MMU需要被虚拟化来支持虚拟机系统。虚拟机系统还是控制着虚拟地址到虚拟机内存物理地址的映射,但虚拟机系统不能直接访问真实的机器内存。VMM负责将虚拟机物理内存映射到真实的机器内存,并使用影子页表来加速映射过程。如图8种标红线之处所示,VMM使用硬件中的TLB来直接映射虚拟内存到机器内存以避免每次访问时需要两级转换。当虚拟机改变了虚拟内存到物理内存的映射时,VMM更新影子页表使得后续可以直接查找。对于所有的虚拟化方案来说,MMU虚拟化都会带来一定的代价,这也是第二代硬件辅助虚拟化方案会改进的地方。
设备和I/O虚拟化
除了CPU和内存虚拟化之外,最后一个需要虚拟化的组件是设备和I/O虚拟化,这涉及到对虚拟设备和共享的物理设备之间的I/O请求路径的管理。
相对于直接访问(direct pass-through)物理硬件的方法,基于软件的I/O虚拟化及管理具有更丰富的特性和更简化的管理方式。以网络方面为例,虚拟网卡和虚拟交换机可以在虚拟机之间创建虚拟网络,而不需要消耗物理网络的带宽,网卡组合(NIC teaming)使得多个物理网卡变成逻辑上的一块网卡,这对虚拟机来说,物理网卡的故障转移是透明的。这样一来,虚拟机通过VMotion可以无缝地在不同系统之间迁移,并且保留已有的MAC地址。高效I/O虚拟化关键的一点就是要保留虚拟化的这些好处同时对CPU增加的消耗减到最少。
hypervisor虚拟化了物理硬件,为虚拟机呈现一系列标准的虚拟设备,如图9所示。这些虚拟设备有效的模拟了所熟知的硬件并将虚拟机的请求翻译成对系统物理硬件的请求。设备驱动的标准化也帮助了虚拟机的标准化并增加在不同平台间的可移植性,因为所有的虚拟机都配置成运行在虚拟硬件上,跟底下真实的系统物理硬件无关。
参考自:https://www.cnblogs.com/woshiweige/p/4518430.html