Hypervisor
Hypervisor是一种运行在物理机上的软件,可以在单个物理机上创建、运行和管理多个虚拟机。Hypervisor根据需要将底层物理计算资源(如cpu、内存)进行抽象统一管理,并按需将资源分配给各个虚拟机。Hypervisor实现了同一物理机上不同虚拟机之间的资源隔离,避免数据窃取或恶意攻击,同时保证虚拟机的资源使用不受周边虚拟机的影响。用户使用虚拟机时,只能访问属于自己的虚拟机的资源(如硬件、软件和数据),不能访问其他虚拟机的资源,保证了虚拟机的数据隔离和安全。
CPU隔离
CPU虚拟化是Hypervisor中最核心的部分,内存虚拟化和IO虚拟化都依赖于CPU虚拟化的正确实现。
X86架构中为了保护指令的运行,提供了指令的4个不同特权级别,术语称为Ring,优先级从高到低依次为:
Ring 0:最高特权级别,被用于运行操作系统内核。
Ring 1:用于操作系统服务。
Ring 2:用于操作系统服务。
Ring 3:用于应用程序。
Hypervisor运行在最高特权级别,可以控制物理处理器上的所有关键资源;而虚拟机操作系统运行在非最高级特权级别,所以其访问物理资源的敏感指令会陷入到Hypervisor中通过软件的方式进行模拟。通过拦截并模拟虚拟机的敏感指令,Hypervisor实现了虚拟机vCPU的隔离,有效防止了虚拟机越权恶意攻击物理机或其他虚拟机。
内存隔离
Hypervisor通过内存虚拟化技术来实现不同虚拟机之间的内存隔离,使每个虚拟机都拥有独立的内存空间,相互之间不受影响。
相较于传统OS两层内存地址映射(“虚拟地址”到“机器地址”),内存虚拟化的核心在于引入一层新的地址空间,叫做Guest物理地址空间。Hypervisor负载管理和分配每个虚拟机的物理内存,虚拟机操作系统看到的是一个虚构的Guest物理地址空间,其指令的目标地址也是一个Guest物理地址。这样的地址在无虚拟化的情况下,其实就是实际的物理地址,但是在虚拟化场景下,这样的地址是不能直接发送到系统总线上去,需要进行正确的转换后才能交由物理处理器执行。虚拟机内部访问内存时,正确的三层地址转换的逻辑是:虚拟机负责将“Guest虚拟地址”映射为“Guest物理地址”,然后Hypervisor负责将“Guest物理地址”映射成“机器地址”。
Hypervisor的这种地址转换机制,保证了虚拟机无法直接接触实际的机器地址,只能访问Hypervisor分配给它的物理内存。
I/O隔离
物理机外设资源是有限的,为了满足多个虚拟机操作系统的需求,Hypervisor通过I/O虚拟化的方式来复用有限的外设资源。Hypervisor拦截虚拟机操作系统对设备的访问请求,然后通过软件的方式来模拟真实设备的效果。从处理器的角度看,外设是通过一组I/O资源(I/O端口或MMIO)来进行访问的,所以设备相关的虚拟化又被称为I/O虚拟化。
Hypervisor采用分离设备模型实现I/O的虚拟化。前端负责将虚拟机的I/O请求传递到Hypervisor中的后端,后端解析I/O请求并提交给相应的设备完成I/O操作。Hypervisor保证虚拟机只能访问分配给它的I/O资源。