QEMU-KVM基本工作原理
QEMU-KVM基本工作原理
QEMU-KVM是一种广泛使用的开源虚拟化技术,它结合了QEMU模拟器和KVM(Kernel-based Virtual Machine)内核模块,为用户提供了一个强大的虚拟化平台。本文将详细介绍QEMU-KVM的基本工作原理,包括其结构、CPU虚拟化和内存虚拟化等方面的内容。
1. QEMU-KVM结构
2. CPU虚拟化
X86体系结构CPU虚拟化技术的称为 Intel VT-x 技术,引入了VMX,提供了两种处理器的工作环境。 VMCS 结构实现两种环境之间的切换。 VM Entry 使虚拟机进去guest模式,VM Exit 使虚拟机退出guest模式。
VMM调度guest执行时,qemu 通过 ioctl 系统调用进入内核模式,在 KVM Driver中获得当前物理 CPU的引用。之后将guest状态从VMCS中读出, 并装入物理CPU中。执行 VMLAUCH 指令使得物理处理器进入非根操作环境,运行guest OS代码。
当 guest OS 执行一些特权指令或者外部事件时, 比如I/O访问,对控制寄存器的操作,MSR的读写等, 都会导致物理CPU发生 VMExit, 停止运行 Guest OS,将 Guest OS保存到VMCS中, Host 状态装入物理处理器中, 处理器进入根操作环境,KVM取得控制权,通过读取 VMCS 中 VM_EXIT_REASON 字段得到引起 VM Exit 的原因。 从而调用kvm_exit_handler 处理函数。 如果由于 I/O 获得信号到达,则退出到userspace模式的 Qemu 处理。处理完毕后,重新进入guest模式运行虚拟 CPU。
3. 内存虚拟化
从CPU视角看来,物理机上的内存是一段1.从0开始,2.连续物理地址。在虚拟化中,VMM接管了所有内存,但guest OS的对内存的使用就存在这两点冲突了,除此之外,一个guest对内存的操作很有可能影响到另外一个guest乃至host的运行。VMM的内存虚拟化就要解决这三个问题,VMM需要给每个guest都虚拟化出这么一段1.从0开始的,2.连续的地址空间作为guest视角下的物理内存,3.还不能互相影响。
在OS代码中,应用程序也是需要一段1.从0开始,2.连续物理地址,3同时不影响其他应用。关键点在于有逻辑地址这个中间层。所以VMM的解决方法也是添加了一个中间层:guest物理地址空间;guest看到是从0开始的guest物理地址空间(类比从0开始的线性地址),而且是连续的,虽然有些地址没有映射;同时guest物理地址映射到不同的host逻辑地址,如此保证了VM之间的安全性要求,比较容易想到将qemu进程的虚拟地址作为这样一段空间提供给guest作为物理地址空间。
这样MEM虚拟化就是GVA->GPA->HPA的寻址过程,传统软件方法有影子页表,硬件虚拟化提供了EPT支持。