处理器虚拟化
处理器全虚拟化技术
主要采用优先级压缩技术(Ring Compression)和二进制代码翻译技术(Binary Translation)。优先级压缩技术让VMM和Guest运行在不同的特权级下。对x86架构而言,即VMM运行在最高特权级别Ring0下,Guest OS运行在Ring 1下,用户应用运行在 Ring 3下。因此,Guest OS的核心指令无法直接下达到计算机系统硬件执行,而是需要 经过VMM的捕获和模拟执行(部分难以虚拟化的指令需要通过Binary Translation技术进行转换)。如图3-6所示。
处理器半虚拟化技术
主要采用Hypercall技术。Guest OS的部分代码被改变,从而使Guest OS会将和特权指令相关的操作都转换为发给VMM的Hypercall(超级调用),由VMM继续进行处理。而Hypercall支持的批处理和异步这两种优化方式,使得通过Hypercall能得到近似于物理机 的速度。如图3-7所示。
处理器硬件辅助虚拟化技术
目前主要有Intel的VT-x和AMD的AMD-V这两种技术。其核心思想都是通过引入新的指令和运行模式,使VMM和Guest OS分别运行在不同模式(ROOT模式和非ROOT模式) 下,且Guest OS运行在Ring0下。通常情况下,Guest OS的核心指令可以直接下达到计 算机系统硬件执行,而不需要经过VMM。当Guest OS执行到特殊指令的时候,系统会 切换到VMM,让VMM来处理特殊指令。如图3-8所示。
内存虚拟化
内存全虚拟化技术
通过使用影子页表(Shadow Page Table)实现虚拟化。VMM为每个Guest都维护一个影子页表,影子页表维护虚拟地址(VA)到机器地址(MA)的映射关系。而Guest页表 维护VA到客户机物理地址(GPA)的映射关系。当VMM捕获到Guest页表的修改后, VMM会查找负责GPA到MA映射的P2M页表或者哈希函数,找到与该GPA对应的MA, 再将MA填充到真正在硬件上起作用的影子页表,从而形成VA到MA的映射关系。而Guest的页表则无需变动。如图3-9所示。
内存半虚拟化技术
通过使用页表写入法实现虚拟化。Guest OS在创建一个新的页表时,会向VMM注册该页表。之后在Guest运行的时候,VMM将不断地管理和维护这个表,使Guest上面的程序能直接访问到合适的地址。
内存硬件辅助虚拟化技术
通过扩展页表EPT(Extended Page Table)实现虚拟化。EPT通过使用硬件技术,使其能在原有的页表的基础上,增加一个EPT页表,用于记录GPA到MA的映射关系。VMM预先把EPT页表设置到CPU中。Guest修改Guest页表,无需VMM干预。地址转换时,CPU 自动查找两张页表完成Guest虚拟地址到机器地址的转换,从而降低整个内存虚拟化所 需的开销。如图3-10
I/O 虚拟化
I/O全虚拟化技术
通过VMM模拟I/O设备(磁盘和网卡等)实现虚拟化。Guest OS所能看到就是一组统一的I/O设备。VMM截获Guest OS对I/O设备的访问请求,然后通过软件模拟真实的硬件。这种方式对Guest而言非常透明,无需考虑底层硬件的情况。
I/O半虚拟化技术
通过前端(Front-End)/后端(Back-End)模拟实现虚拟化。Guest OS中的驱动程序为前端,VMM提供的与Guest通信的驱动程序为后端。前端驱动将Guest OS的请求通过与VMM间的特殊通信机制发送给VMM的后端驱动,后端驱动在处理完请求后再发送给物理驱动。
I/O硬件辅助虚拟化技术
主要有Intel的VT-d、AMD的IOMMU和PCI-SIG的IOV这三种技术。前两种技术属于直接I/O技术,物理设备可以直接分配给虚拟机使用(而不需经过VMM),通过硬件芯片完成GPA到MA的翻译。IOV技术在其基础上,在硬件设备中增加了一个PCIe设备,用于呈现一个物理功能(PF)和多个虚拟功能(VF),从而使每个虚拟功能可单独分配给 不同的客户机使用。