上次讲到了虚拟化的基础知识,比如虚拟化的应用、各个厂商都是通过何种技术路径来实现的等等,本篇想记录一下我学习到的 CPU 内存虚拟化和网络虚拟化相关知识,通过记录来制造反馈,让自己更有效地学习。需要注意的是,学习虚拟化就免不了和 打交道了。
在此之前还是回顾一下虚拟化的基础知识。
虚拟化对于我们网络行业来说已经起到了越来越大的作用,从最开始做实验用的 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 基础薄弱的同学推荐 这本书,在线阅读: 网站上有电子版可以阅读,如感觉到有所收获,别忘了买一本实体书支持一下作者。学无止境,希望和大家一起用知识充实自己。