29 内核在虚拟化中的角色:理解KVM
# 29 内核在虚拟化中的角色:理解KVM
基于内核的虚拟机(KVM,Kernel-based Virtual Machine)使Linux内核能够向用户空间应用程序提供硬件辅助的虚拟化功能。它本身并不是一个完整的虚拟机管理程序,而是一个暴露现代CPU内置虚拟化功能的内核模块。当与QEMU等用户空间虚拟机监视器结合使用时,KVM便构成了一个完整、高效且模块化的虚拟化平台。
QEMU在用户空间运行,负责定义虚拟硬件、分配内存和模拟设备。要启动虚拟机,QEMU会通过/dev/kvm接口与内核通信,请求创建虚拟机及其虚拟CPU(vCPU)。每个vCPU都由一个内核线程支持,并像任何其他任务一样由Linux内核调度。
在支持如Intel VT-x或AMD-V等虚拟化扩展的处理器上,客户机代码在不同于主机的特殊CPU模式下执行。这种模式区别对于客户机而言称为非root模式,对于主机而言称为root模式。这些模式是处理器虚拟化功能集的一部分,与传统的特权级别(如0环或3环)完全独立。例如,客户机内核在0环中运行,但处于非root模式,而主机内核则在0环(ring 0)的root模式下运行。
当虚拟CPU执行客户机代码时,它在非root模式下运行,允许大多数指令直接在硬件上执行。这实现了高性能且开销极小。然而,某些操作(如访问I/O端口、修改控制寄存器或执行特权系统指令)在此模式下是不允许的。当CPU遇到此类指令或预定义条件时,会执行VM退出(VMEXIT),将控制权从非root模式转换为root模式,把执行交还给内核。
KVM会检查退出原因并相应地处理。如果退出涉及CPU内部状态或内存管理,可能在内核中解决;对于与I/O或设备相关的操作,该事件会转发给QEMU,由其执行所需的模拟。然后,QEMU使用KVM接口更新客户机的虚拟CPU状态,KVM从中断点恢复客户机的执行。
为了隔离客户机内存,KVM使用如扩展页表(EPT,Extended Page Tables)等硬件辅助技术,将客户机物理地址转换为主机物理地址。这些映射由内核管理,并在发生更改时同步,确保安全且一致的内存访问。
当虚拟机关闭时,KVM会释放所有相关资源并重置CPU的虚拟化状态。在整个生命周期中,KVM管理执行转换、隔离边界和底层CPU控制,而QEMU处理更高级别的编排。它们共同提供了一个高性能、安全且深度集成到Linux内核中的虚拟化解决方案。