QEMU与KVM架构

完整架构图,来自QEMU官网

QEMU与KVM架构总体上分为3部分。

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

VMX root模式的内核层(左下)

虚拟机的运行(右上)

VMX root相对于VMX non-root模式,CPU引入了硬件虚拟化指令后有了这些概念,

VMX root可以理解为宿主机模式,VMX non-root可以理解为虚拟机模式

虚拟机运行在VMX non-root模式下

VMX root模式与未引入VT-x之前是一样的,CPU在运行包括QEMU在内的普通进程和宿主机的操作系统内核时,CPU处于该模式

VMX non-root模式,覆盖CPU运行虚拟机中的用户程序和操作系统代码的时间。

CPU的运行模式和CPU运行时的特权等级是相互正交的

(ARM的security monitor,安全世界和非安全世界,和EL等级)

虚拟机在VMX root模式和VMX non-root模式下,都有ring 0到ring 3 四个特权级别(这是X86概念了)

QEMU 主要任务

左边上半部分,覆盖了QEMU的主要任务:

QEMU在初始化时:
创建模拟的芯片组
创建CPU线程来表示虚拟机的CPU执行流
根据用户在命令行指定的设备为虚拟机创建对应的虚拟设备。

main loop是一个主线程里的循环,虚拟机运行期间在该循环内监听多种事件(还会注册事件对应的回调函数),包括:

虚拟机对设备的I/O访问请求

用户对虚拟机管理界面,虚拟设备对应的宿主机上的一些IO时间

QEMU应用层接受到这些事件之后,调用预先定义好的函数进行处理。

右上部分是虚拟机的运行,虚拟机也有自己的"小世界",多个特权等级,对应内核层和应用层。只不过是non-root模式下的

虚拟机内可以有操作系统,它对QEMU和KVM不感知

常用操作系统可以不经过修改就运行在虚拟机中

虚拟机中的一个CPU 对应为QEMU进程中的一个线程(这个线程是宿主机内的一个凡人,在虚拟机里就但此大任)

QEMU和KVM相互写作,这些线程会被宿主机操作系统正常调度,执行虚拟机中的代码。

虚拟机中的物理内存 ,对应QEMU进程中的虚拟内存,虚拟机中的操作系统,也有自己的页表管理,它所使用的物理地址,是QEMU进程中的虚拟地址。

即:

虚拟机的虚拟地址 ---> 虚拟机内的页表管理(walk等) --> 虚拟机的物理地址(也就是QEMU进程的虚拟地址)--> QEMU所在操作系统的页表管理 --> 宿主机的物理地址

套娃了。。。

虚拟机中的设备,是通过QEMU呈现给它的,操作系统启动时对设备作枚举,加载对应驱动,运行过程中,虚拟机操作系统通过设备的IO端口,MMIO进行交互,KVM截获这个请求,大多时候KVM将请求分发给用户空间的QEMU进程,由QEMU处理这些IO请求

上图的下半部分,表示的是位于linux内核中的KVM驱动,KVM驱动以misc设备驱动的方式存在与内核中,通过/dev/kvm设备节点,导出一些列接口

QEMU用户态程序可以通过这些接口来控制虚拟机的各个方面:

如CPU个数,内存布局,运行等等

KVM需要解惑虚拟机产生的迅即退出事件,并进行处理。

相关推荐
万联WANFLOW2 分钟前
从工具协同到智能体驱动:Meta Muse 小型企业版的架构演进与行业启示
网络·架构·业界资讯
Eloudy3 分钟前
全文 - version.A - AMBA CHI Chip-to-Chip(C2C)
java·开发语言·数据库·gpu·chiplet
秋名RG11 分钟前
Java历代LTS版本新特性详解(代码增强版)
java·开发语言·python
李少兄11 分钟前
深度剖析 Hutool ObjectUtil
java·开发语言
魏码不凡12 分钟前
Go 编译报错:undefined: webp.Encode 问题排查与解决
开发语言·后端·golang
276695829213 分钟前
youdao/有道翻译APP 算法协议分析
开发语言·前端·python·sign·youdao·有道翻译app算法·有道app协议请求
励志不掉头发的内向程序员21 分钟前
【从零写一个CAD 04】中键拖动平移:抓住一个点,让它一直待在鼠标底下
开发语言·c++·qt·学习·系统架构·计算机外设
tachibana22 小时前
与其他语言相比,使用 Go 有什么好处?
开发语言·后端·golang·go
阿俊-全栈开发6 小时前
LikeShop 单商户SaaS商城分销模块二开:佣金计算与结算逻辑实现
java·开发语言·微服务·likeshop·likeshop开源商城·likeshop多商户
m0_3807438710 小时前
C++中的freopen的用法实例详解
开发语言·c++