虚拟化是指通过虚拟化技术将一台计算机虚拟为多台逻辑计算机。在一台计算机上同时运行多个逻辑计算机每个逻辑计算机可运行不同的操作系统并且应用程序都可以在相互独立的空间内运行而互不影响从而显著提高计算机的工作效率。虚拟化技术可以扩大硬件的容量简化软件的重新配置过程。CPU的虚拟化技术可以单CPU模拟多CPU并行允许一个平台同时运行多个操作系统并且应用程序都可以在相互独立的空间内运行而互不影响从而显著提高计算机的工作效率。虚拟化的类别1、模拟emulation(底层和模拟架构不需要一致)通过软件模拟是需要模拟环Ring0/1/2/3层但是 对较少。硬件--Host--VMM(emulation)--Virtulization host2、完全虚拟化(full-virtualization):只虚拟出环ring0(以CPU虚拟化来说明)BT二进制翻译技术(Binary Translate)将模拟的CPU直接翻译成特权指令限定虚拟结构平台和底层物理架构必须保持一致。基于软件的完全虚拟化。• 优点不用修改GuestOS内核可以直接使用应用广泛。• 缺点在VMM捕获特权指令和翻译过程会导致性能的下降。3.硬件辅助虚拟化5个指令环在环0的底层加了环-1环0的特权指令给了环-1HVM(hardware virtulization machine)属于硬件的完全虚拟化。4.半虚拟化(para-virtulization)Guest明确知道自己运行在虚拟机上在执行特权指令时直接向hyper call调用省去了特权指令的翻译过程。• 优点相对完全虚拟化性能高省去了特权指令的翻译过程。• 缺点需要对GuestOS内核的修改应用有限制。5.OS级别的虚拟化硬件--OS kernel--多个用户空间内存虚拟化KVM(Kernel Virtual Machine) , 作为开源的内核虚拟机越来越受到 IBMRedhatHPIntel 等各大公司的大力支持基于 KVM 的开源虚拟化生态系统也日益完善。而实现 KVM 虚拟化使客户机高效地、安全地使用宿主机的内存资源就必须实现内存的虚拟化。客户机物理地址空间为了实现内存虚拟化让客户机使用一个隔离的、从零开始且具有连续的内存空间KVM 引入一层新的地址空间即客户机物理地址空间 (Guest Physical Address, GPA)这个地址空间并不是真正的物理地址空间它只是宿主机虚拟地址空间在客户机地址空间的一个映射。对客户机来说客户机物理地址空间都是从零开始的连续地址空间但对于宿主机来说客户机的物理地址空间并不一定是连续的客户机物理地址空间有可能映射在若干个不连续的宿主机地址区间如下图 1 所示由于客户机物理地址不能直接用于宿主机物理 MMU 进行寻址所以需要把客户机物理地址转换成宿主机虚拟地址 (Host Virtual Address, HVA)为此KVM 用一个 kvm_memory_slot 数据结构来记录每一个地址区间的映射关系此数据结构包含了对应此映射区间的起始客户机页帧号 (Guest Frame Number, GFN)映射的内存页数目以及起始宿主机虚拟地址。于是 KVM 就可以实现对客户机物理地址到宿主机虚拟地址之间的转换也即首先根据客户机物理地址找到对应的映射区间然后根据此客户机物理地址在此映射区间的偏移量就可以得到其对应的宿主机虚拟地址。进而再通过宿主机的页表也可实现客户机物理地址到宿主机物理地址之间的转换也即 GPA 到 HPA 的转换。实现内存虚拟化最主要的是实现客户机虚拟地址 (Guest Virtual Address, GVA) 到宿主机物理地址之间的转换。根据上述客户机物理地址到宿主机物理地址之间的转换以及客户机页表即可实现客户机虚拟地址空间到客户机物理地址空间之间的映射也即 GVA 到 HPA 的转换。显然通过这种映射方式客户机的每次内存访问都需要 KVM 介入并由软件进行多次地址转换其效率是非常低的。因此为了提高 GVA 到 HPA 转换的效率KVM 提供了两种实现方式来进行客户机虚拟地址到宿主机物理地址之间的直接转换。其一是基于纯软件的实现方式也即通过影子页表 (Shadow Page Table) 来实现客户虚拟地址到宿主机物理地址之间的直接转换。其二是基于硬件对虚拟化的支持来实现两者之间的转换。下面就详细阐述两种方法在 KVM 上的具体实现。影子页表由于宿主机 MMU 不能直接装载客户机的页表来进行内存访问所以当客户机访问宿主机物理内存时需要经过多次地址转换。也即首先根据客户机页表把客户机虚拟地址转传成客户机物理地址然后再通过客户机物理地址到宿主机虚拟地址之间的映射转换成宿主机虚拟地址最后再根据宿主机页表把宿主机虚拟地址转换成宿主机物理地址。而通过影子页表则可以实现客户机虚拟地址到宿主机物理地址的直接转换。如下图 2 所示影子页表简化了地址转换过程实现了客户机虚拟地址空间到宿主机物理地址空间的直接映射。但是由于客户机中每个进程都有自己的虚拟地址空间所以 KVM 需要为客户机中的每个进程页表都要维护一套相应的影子页表。在客户机访问内存时真正被装入宿主机 MMU 的是客户机当前页表所对应的影子页表从而实现了从客户机虚拟地址到宿主机物理地址的直接转换。而且在 TLB 和 CPU 缓存上缓存的是来自影子页表中客户机虚拟地址和宿主机物理地址之间的映射也因此提高了缓存的效率。网络虚拟化1.nat virbr0虚拟机能与宿主机相连,虚拟机之间可以正常通讯,并且虚拟机可以同过NAT(地址转换的方式)与其他主机通讯(SNAT)2.hostonly virbr1虚拟机只能与宿主机相连,虚拟机之间可以正常通讯3.bridg br0虚拟机和宿主机物理网卡桥接到一起,可以和其他主机及虚拟机通讯