上次讲到了虚拟化的基础知识,比如虚拟化的应用、各个厂商都是通过何种技术路径来实现的等等,本篇想记录一下我学习到的CPU内存虚拟化和网络虚拟化相关知识,通过记录来制造反馈,让自己更有效地学习。需要注意的是,学习虚拟化就免不了和Linux打交道了。
在此之前还是回顾一下虚拟化的基础知识。
虚拟化对于我们网络行业来说已经起到了越来越大的作用,从最开始做实验用的VMware和EVE,到现网运行的各种虚拟网络设备,无一例外都提醒着从业者要多加了解此技术。不仅是技术人员会用到虚拟化,其实大多数人的生活都离不开虚拟化,比如我们所用的Windows也是一种虚拟化,因为他是分时复用系统,分时系统最早由IBM的工程师研发出来,它会把资源切分成无数的小分片,这样就实现了多任务的同时处理。广义的虚拟化是在一套硬件平台上虚拟出多个系统,来提高硬件的利用效率。
接下来介绍一下CPU硬件辅助虚拟化。这时就要提及CPU的两大厂商Intel和AMD了,其中Intel使用VT-x技术,AMD使用AMD-V技术来实现。他们的核心思想其实都是通过引入新的指令和运行模式,使VMM和Guest OS分别运行在ROOT模式和非ROOT模式之下,Guest OS运行在Ring 0下。通常Guest OS核心指令不需要经过VMM,可直接下达到计算机硬件被执行,只有当它执行到特殊指令时才会切到VMM来处理特殊指令。
当讲到内存虚拟化时,首先要了解三个概念:VA(virtual address)虚拟机逻辑地址,虚拟机中进程使用的逻辑地址;PV(phyiscal virtual address)虚拟机物理机地址,虚拟机自己看到自己的物理地址;MA 是host os真正的物理机地址。内存虚拟化其实就是由MA到PV的映射。物理机内存是一段连续的地址空间,虚拟监视器(VMM)上层的各个虚拟机共享物理机的内存地址空间。但由于虚拟机是以随机的方式访问内存,而又需要保证虚拟机内部内存地址的连续,因此VMM就需要合理的映射PV和MA才行。VMM对物理机内存进行管理,并对虚拟机的需求进行合理分配。其中的映射是通过内存虚拟化中的内存管理单元来完成,其中的技术分为影子页表法、页表写入法和扩展页表EPT。
影子页表法实现的是内存全虚拟化。其中VMM为每个Guest维护一个影子页表,表中维护VA到MA的映射关系,而Guest也不维护VA到PV的映射关系。当VMM捕获到Guest页表的变化时,VMM会查找负责PV到MA映射的P2M页表或哈希函数,找到对应的MA,再将它填充到真正在硬件上起作用的影子页表,而Guest页表无需变动。
页表写入法是一种半虚拟化,通过修改操作系统的代码,剥夺Guest OS的写入页表权力,所以VMM可直接将及其弟子写入到Guest OS的页表而实现页表虚拟化。其细节是当客户机常见页表时,VMM也会创建一套相同的仪表,其中保存到时虚拟机物理地址和物理机地址的映射,在客户机对页表写操作时,VMM剥夺客户机操作系统的写操作权限,并对客户机操作系统页表进行更新,是Guest OS从它自己的页表中读取真实物理机地址。
扩展页表EPT是硬件辅助虚拟化,它在原有页表基础上又加了EPT页表,用来记录PV到MA的映射关系,VMM把EPT页表设置到CPU中,就无需VMM再干预了,转换时CPU自动查找两张页表来完成Guest到机器地址的转换,降低整个内存虚拟化的开销。
在网络虚拟化中,通过SR-IOV技术实现。SR-IOV主要解决pass-through只能被一台虚拟机访问的问题,其中pass-through模型是让虚拟机直接使用物理设备,使得网络性能最高。SR-IOV的实现需要CPU、芯片组和PIC等协同在硬件上实现,实现了虚拟化的“最后一公里”。支持SR-IOV的网卡可以在VMM里注册多个网卡,每个设备通过pass-through分配给虚拟子机。
在上篇我们介绍了不同厂家的各种虚拟化软件和技术,比如VMware,RedHat的QEMU-KVM,微软的hyper-V,还有Citrix的Xen。本篇介绍了虚拟化中的内存虚拟化和网络虚拟化的基础知识。需要注意的是,学习虚拟化就免不了和Linux打交道了,因为大部分时间操作的都是Linux系统,在此我对Linux基础薄弱的同学推荐《Linux就该这么学》这本书,在线阅读:www.linuxprobe.com.网站上有电子版可以阅读,如感觉到有所收获,别忘了买一本实体书支持一下作者。学无止境,希望和大家一起用知识充实自己。