news 2026/6/23 1:37:26

KVM 架构概述

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
KVM 架构概述

传统的非 VHE 模式

HostOS 和 Guest OS 运行在 EL1 级别,HostOS 上的 Qemu 运行在 EL0 级别,KVM 运行在 EL2 级别。

一个 VM 对应 HostOS 上一个 QEMU 进程;一个 vCPU 对应 HostOS 上一个 QEMU 线程。

当 CPU 上运行 Host Context 时,时钟中断直接进入 HostOS;当 CPU 上运行 Guest Context 时,时钟中断直接进入 KVM。

时钟中断进入 KVM 时,KVM 保存 Guest Context, 设置 Host Context(此时通过设置 HCR_EL2.IMO 改变了后续的时钟中断陷入行为),后 ERET 进入 HostOS. HostOS 继续处理此时钟中断,调用 scheduler 决定之后运行哪个线程。

关于调用栈的冻结状态

// QEMU 代码 (User Space) // ... 准备工作 ... int ret = ioctl(vcpu_fd, KVM_RUN, 0); // <--- QEMU 线程停在这里! // ... 此时 QEMU 陷入内核态,等待内核返回 ... // ... 只有当 VM 发生需要 QEMU 处理的事件(如 IO)时,才会运行到下一行 ... if (ret < 0) handle_error(); switch (run->exit_reason) { ... }

当 CPU 上要从 HostOS 切换到 GuestOS 时

  1. QEMU 执行 ioctl(vcpu_fd, KVM_RUN, 0); 这是一个系统调用
  2. 进入 HostOS 后,HostOS 执行 kvm_* 一系列工作,最终执行到 kvm_call_hyp. 这是一个 hypervisor call, HostOS 中断在这里,后进入 EL2
  3. EL2 的 KVM 保存 Host 上下文,加载 Guest 上下文,ERET 后进入 EL1 执行 GuestOS
  4. 发生 Exit 事件(比如 Host 时钟中断),Guest -> KVM
  5. KVM 保存 Guest ctx 加载 Host ctx, ERET
  6. HostOS 认为 hvc 执行完毕
  7. HostOS 检查 hvc 返回的原因
    1. 时钟中断但当前线程时间片没用完,他会继续调用 hvc, 这个过程完全不涉及 QEMU, QEMU 继续冻结在 ioctl 那里
    2. 时间片用完了,HostOS 调用 schedule, QEMU 线程被挂起,CPU 运行其他线程
    3. Guest 发起 IO 请求:HostOS 从系统调用返回 QEMU, QEMU 去处理 IO
  8. 在 7.3 的情况下,QEMU 进程从 ioctl 返回,执行后续的代码

从上面这个流程可以看出,KVM 其实应该分为两个部分,一个是以内核模块形式运行在 EL1 的部分,另一个是运行在 EL2 的微型 Hypervisor 代码。

EL1 的部分是虚拟化逻辑的核心,他处理 IO、内存管理、指令模拟、中断注入。它通过 HVC 指令驱动 EL2。EL2 的部分仅是利用位于 EL2 的特权,按 EL1 部分的指示切换硬件。

EL1 部分的 KVM 都做了什么,是怎么利用 Linux 的

1. GuestOS 的内存(IPA)是谁分配的

  1. VM 启动时,QEMU 进程会在用户态调用 mmap,获取一段 HVA
  2. QEMU 会通过 ioctl 告诉 KVM 模块这段 HVA, 且告诉 KVM 在 GuestOS 的视角下,这段 HVA 应该对应哪段 GPA
  3. 当 GuestOS 试图访问 GPA 时,此时 stage2 页表空空,触发缺页异常,陷入 KVM
  4. KVM 内核模块拿着 GPA 查对应的 HVA, 用 get_user_pages() 查 HPA(可能 hostos 此时才真正为 HVA 分配 HPA)
  5. 查到 HPA 后,建立 GPA -> HPA 的 stage-2 映射
  6. KVM 模块返回 Guest

2. GuestOS 的栈地址是怎么指定的

栈空间是内存的一部分,但最初的 Guest ctx 中的 sp 指针指向哪里?这个问题还比较复杂。

非 VHE 模式的缺陷

通过上面的描述不难看出,如果在执行 GuestOS 时发生时钟中断或缺页等异常,就会连续触发四次特权级切换。

  1. GuestOS -> KVM EL2
  2. KVM EL2 -> HostOS KVM EL1
  3. HostOS KVM EL1 -> KVM EL2
  4. KVM EL2 -> GuestOS

为切换 Host Guest Context, KVM EL2 就必不可少,为利用 Linux 的功能实现 hypervisor, KVM EL1 kernel module 就必不可少,所以上述四次特权级切换就无法避免,这样性能开销就很大,所以才引入了 VHE 模式。

现代的 VHE 模式

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/23 16:59:25

模型漂移的检测与应对:软件测试者的实战手册

当AI模型开始"失准"——测试工程师的新挑战 一、认识模型漂移&#xff1a;从静态测试到动态监控的范式转移 在传统软件测试中&#xff0c;我们习惯于对确定性的输入输出进行验证。但当系统引入机器学习模型后&#xff0c;我们面临的全新问题是&#xff1a;模型性能…

作者头像 李华
网站建设 2026/6/23 1:43:55

金融科技的智能风控测试

引言&#xff1a;智能风控测试的时代挑战 随着深度学习与大数据技术在金融风控领域的深度应用&#xff0c;传统基于规则引擎的测试方法已难以满足新一代智能风控系统的质量保障需求。测试工程师面临模型动态更新、数据维度多元、决策链路隐蔽等全新挑战&#xff0c;亟需建立适…

作者头像 李华
网站建设 2026/6/23 16:54:39

Open WebUI重排序终极指南:三步提升搜索精准度90%

Open WebUI重排序终极指南&#xff1a;三步提升搜索精准度90% 【免费下载链接】open-webui Open WebUI 是一个可扩展、功能丰富且用户友好的自托管 WebUI&#xff0c;设计用于完全离线操作&#xff0c;支持各种大型语言模型&#xff08;LLM&#xff09;运行器&#xff0c;包括O…

作者头像 李华
网站建设 2026/6/23 7:39:54

测试预算的动态优化:从静态规划到敏捷响应

在当今快速迭代的软件开发环境中&#xff0c;测试预算管理不再仅仅是年初的固定分配&#xff0c;而是一个需要持续调整的动态过程。软件测试从业者面临着诸多挑战&#xff1a;项目需求频繁变更、新技术工具涌现、测试环境成本波动&#xff0c;以及市场竞争对质量的更高要求。静…

作者头像 李华
网站建设 2026/6/23 16:59:33

【树莓派pico/pico2】在pico-sdk中自定义板子

一、前言树莓派pico/pico2是树莓派推出的基于自家MCU&#xff08;RP2040、RP2350&#xff09;的核心板。现已有很多基于RP2040和RP2350芯片的各类核心板和开发板&#xff0c;也有用户自己制作的板子。如果用户使用的板子&#xff0c;其引脚定义、Flash配置和树莓派pico/pico2相…

作者头像 李华
网站建设 2026/6/23 5:25:09

【Java + Elasticsearch全量 增量同步实战】

Java Elasticsearch 全量 & 增量同步实战&#xff1a;打造高性能合同搜索系统在企业合同管理系统中&#xff0c;我们常常遇到以下挑战&#xff1a;合同量大&#xff0c;文本内容多&#xff0c;传统数据库查询慢搜索需求多样&#xff1a;全文搜索、按签署人筛选、分页排序历…

作者头像 李华