QEMU_002

返回主页
返回上一页

Understanding QEMU [L1]

参考文献:

  • 《QEMU/KVM源码解析与应用》

@last_update: 2025/09/10

 

[David Wheel] "All problems in computer science can be solved by another level of indirection"

 

About QEMU/KVM

QEMU支持用户程序模拟和系统虚拟化模拟

系统虚拟机天生适用于需要按需服务的云计算场景

 

KVM本身是一个Linux内核模块,导出API到user space。从而user space可以使用这些API创建虚拟机。

 

QEMU/KVM架构

上图是QEMU/KVM的整体架构图

现阶段,简单来说,这个架构图包含三个部分

VMX root / non-root 是CPU引入支持硬件虚拟化指令集VT-x之后的概念。

目前可以把VMX root理解为宿主机,把VMX non-root理解为虚拟机

VMX root / non-root 都有ring 0 到ring 3四个特权级别

 

左上方(VMX root模式的应用层)

 

右上方(VMX non-root模式的虚拟机)

 

正下方(VMX root模式的内核层)

实际上是Linux Kernel中的KVM驱动,KVM以misc(杂项)设备驱动的方式存在于内核当中。

 

组件虚拟化

CPU虚拟化

 

内存虚拟化

 

外设虚拟化

Linux内核代码中最多的代码是设备驱动,相应地,QEMU最多的代码也是设备模拟

 

三种设备模拟方案

最早的QEMU的设备模拟是纯软件模拟,无需修改虚拟机内核

随后社区提出了virtio

virtio仍然不能完全满足一些高性能的场景,于是又有了设备直通方案

 

中断虚拟化

OS通过写设备的I/O端口或MMIO地址与设备交互,设备通过发送中断来通知虚拟操作系统事件。

 

KVM API

KVM 本质上是一个 内核驱动,它通过一组 ioctl 系统调用 向用户空间导出 API,用户空间的 VMM(比如 QEMU)通过这些 ioctl 来创建/管理虚拟机和 vCPU。

基本思路

所以 所有 KVM 的接口都是通过 ioctl 提供的

ioctl的层次结构

KVM 的 ioctl 可以分为几个层级,每个层级都有对应的 fd:

 

ioctl 交互流程(以 QEMU 启动 VM 为例)

 

设计特点