QEMU 中 x86_cpu_realizefn 到 ept_emulation_fault 的调用流程解析(macos)

关于qemu的二三事(6)————qemu源码分析之vcpu qemu源码分析之vcpu 阅读详情

QEMU 中 x86_cpu_realizefn 到 ept_emulation_fault 的调用流程解析

在 QEMU 的 x86 虚拟化实现中,CPU 的初始化与执行流程涉及多个关键函数,从 CPU 设备的最终初始化(x86_cpu_realizefn)到虚拟机监控程序(HVF)中处理 EPT(扩展页表)缺页异常(ept_emulation_fault),以下是完整调用链的详细分析:


1. x86_cpu_realizefn: x86 CPU 设备的 Realize 函数

作用:
x86_cpu_realizefn 是 x86 CPU 设备的 realize 方法,负责完成 CPU 的最终初始化(如设置 CPU 型号、检查特性兼容性、注册热插拔逻辑等)。
关键步骤:

  1. CPU 特性验证:检查 CPU 型号支持的指令集与用户配置是否兼容。
  2. APIC 初始化:配置本地 APIC 和 IOAPIC(中断控制器)。
  3. 调用 qemu_init_vcpu:触发虚拟 CPU(vCPU)线程的初始化。
// 代码路径:target/i386/cpu.c
static void x86_cpu_realizefn(DeviceState *dev, Error **errp) {
    X86CPU *cpu = X86_CPU(dev);
    // ... 配置 CPU 特性、APIC 等
    qemu_init_vcpu(&cpu->parent); // 初始化 vCPU 线程
}

2. qemu_init_vcpu: 初始化 vCPU 线程

作用:
为每个虚拟 CPU 创建执行线程,并绑定到加速器(如 HVF/KVM)的后端操作。
关键流程:

  1. 分配 CPU 状态:初始化 CPUState 结构体。
  2. 绑定加速器操作:通过 accel_ops 调用加速器特定的 vCPU 初始化函数。
  3. 创建线程:调用加速器的 create_vcpu_thread 方法启动线程。
// 代码路径:cpus-common.c
void qemu_init_vcpu(CPUState *cpu) {
    // ... 分配资源
    cpu->accel_ops->create_vcpu_thread(cpu); // 调用加速器的线程创建函数
}

3. ops->create_vcpu_thread: 加速器启动 vCPU 线程

上下文:
AccelOpsClass 是加速器(如 HVF/KVM)的操作函数表,create_vcpu_thread 是具体实现。以 HVF 为例,其实现为 hvf_start_vcpu_thread。
关键步骤:

  1. 线程创建:通过 qemu_thread_create 创建 vCPU 线程。
  2. 线程入口函数:绑定到 hvf_cpu_thread_fn,这是 vCPU 执行的主循环。
// 代码路径:accel/hvf/hvf-accel-ops.c
static void hvf_start_vcpu_thread(CPUState *cpu) {
    qemu_thread_create(&cpu->thread, "hvf-vcpu", hvf_cpu_thread_fn, cpu, ...);
}

4. hvf_cpu_thread_fn: HVF 的 vCPU 线程主循环

作用:
循环执行客户机代码(通过 hvf_vcpu_exec)并处理退出事件。
核心逻辑:

// 代码路径:accel/hvf/hvf-accel-ops.c
static void *hvf_cpu_thread_fn(void *arg) {
    CPUState *cpu = arg;
    while (1) {
        qemu_wait_io_event(cpu); // 等待执行信号
        qemu_cpu_exec(cpu);      // 调用 hvf_vcpu_exec
    }
}

5. hvf_vcpu_exec: 执行客户机代码并处理 VM Exit

作用:
通过 Hypervisor.framework 的 hv_vcpu_run 进入 Guest 模式执行指令,发生 VM Exit 后处理退出原因。
关键流程:

  1. VM Entry:调用 hv_vcpu_run 运行客户机代码。
  2. VM Exit 处理:根据退出原因(如 EPT 缺页、I/O 操作)调用处理函数。
// 代码路径:target/i386/hvf/x86hvf.c
int hvf_vcpu_exec(CPUState *cpu) {
    hv_return_t ret = hv_vcpu_run(cpu->hvf_fd);
    uint64_t exit_reason = hv_vcpu_exit_reason(cpu->hvf_fd);
    switch (exit_reason) {
        case EXIT_REASON_EPT_FAULT:  // EPT 缺页异常
            ept_emulation_fault(cpu); 
            break;
        // ... 其他退出类型
    }
    return 0;
}

6. ept_emulation_fault: EPT 缺页异常处理

作用:
处理客户机因 EPT 页表缺失或权限错误引发的 VM Exit,完成影子页表或嵌套页表的修复。
关键步骤:

  1. 获取缺页地址:通过 hv_vcpu_read_vmcs 读取 VMCS 中的 GUEST_PHYSICAL_ADDRESS。
  2. 模拟缺页处理:根据缺页类型(读/写/执行)更新 EPT 页表或注入异常到客户机。
  3. 重新执行指令:修复后重新执行触发缺页的客户机指令。
// 代码路径:target/i386/hvf/x86hvf.c
static void ept_emulation_fault(CPUState *cpu) {
    uint64_t gpa = hv_vcpu_read_vmcs(cpu->hvf_fd, VMCS_GUEST_PHYSICAL_ADDRESS);
    bool is_write = ...;  // 从 VMCS 中解析缺页类型
    hvf_handle_ept_violation(cpu, gpa, is_write); // 更新页表或触发 MMU 操作
}

完整调用链总结

x86_cpu_realizefn          → x86 CPU 设备初始化
  → qemu_init_vcpu          → 触发 vCPU 线程创建
    → ops->create_vcpu_thread → 加速器启动线程(HVF: hvf_start_vcpu_thread)
      → hvf_cpu_thread_fn   → vCPU 线程主循环
        → qemu_cpu_exec     → 调用 hvf_vcpu_exec
          → hvf_vcpu_exec   → 执行客户机代码
            → hv_vcpu_run   → VM Entry
              → VM Exit(EPT 缺页)
                → ept_emulation_fault → 处理缺页异常

关键代码文件

  1. CPU 初始化:
    • target/i386/cpu.c:x86 CPU 设备模型,包含 x86_cpu_realizefn。
  2. 线程管理:
    • cpus-common.c:通用 vCPU 线程逻辑(qemu_init_vcpu)。
  3. HVF 后端:
    • accel/hvf/hvf-accel-ops.c:HVF 的加速器操作(hvf_start_vcpu_thread)。
    • target/i386/hvf/x86hvf.c:x86 架构的 HVF 实现(hvf_vcpu_exec、ept_emulation_fault)。

调试与扩展

  • 日志跟踪:
    运行 QEMU 时添加 -D qemu.log -d cpu_reset,cpu_exec,mmu 可记录 CPU 初始化、执行流和 MMU 事件。
  • 断点调试:
    在 ept_emulation_fault 中设置 GDB 断点,观察缺页地址和修复逻辑。
  • 扩展场景:
    若需支持自定义内存映射(如设备直通),需修改 EPT 处理逻辑,确保客户机物理地址到主机物理地址的正确映射。

总结

从 x86_cpu_realizefn 到 ept_emulation_fault 的流程,涵盖了 QEMU 中 x86 CPU 的初始化、vCPU 线程启动、客户机代码执行及内存虚拟化异常处理的核心路径。理解此流程对调试虚拟化问题(如性能瓶颈、内存访问错误)或开发新功能(如自定义 EPT 处理)至关重要。

SpringBoot+Vue+MySQL 高校学科竞赛平台 完整可运行版(源码+文档) 本项目基于SpringBoot+Vue+MySQL构建高校学科竞赛管理平台,覆盖学生、教师、领队教师、管理员四大角色,实现竞赛发布、报名、刷题、评分、公示等全流程闭环管理。系统架构清晰,技术主流,配套完整源码、数据库脚本、万字论文、开题报告、答辩PPT及部署文档,支持一键运行,适用于毕业设计、课程设计及院系二次开发,真正实现“开箱即用”。 阅读详情

相关推荐

别再死记硬背了!用Python可视化带你直观理解柯西收敛定理(附NumPy代码)

本文通过Python可视化技术,结合NumPy和Matplotlib,直观展示柯西收敛定理的动态过程。文章提供了完整的代码实现,帮助读者从抽象数学定义过渡到具象理解,特别适合数学学习者和Python开发者。通过热力图和交互式参数探索,读者可以清晰观察数列收敛特性,提升数学分析的学习效率。

weixin_28465009的博客 185

QEMU 中关于CPU初始化的重要函数调用栈

QEMU的版本是v2.4.0.1之后的 Breakpoint 1, x86_cpu_realizefn (dev=0x55c743a33e70, errp=0x7ffef5886bb0) at /home/mce/workspace/git/qemu/qemu/target-i386/cpu.c:2821 2821 { (gdb) bt #0 x86_cpu_realizefn

六六哥的博客 2183

ASReview:基于主动学习的AI文献筛选工具,提升科研效率

主动学习是机器学习的一个重要分支,其核心原理是让算法能够主动选择最有价值的数据进行标注,从而以更低的成本获得更好的模型性能。这一技术通过人机协作的闭环流程,显著提升了数据标注和模型训练的效率和精度。在工程实践中,主动学习尤其适用于数据标注成本高昂或数据类别不平衡的场景,例如医学影像分析、自然语言处理中的文本分类以及推荐系统的冷启动问题。通过优先标注模型最不确定的样本,它能够有效解决传统机器学习面临的冷启动和数据稀疏性挑战。本文聚焦的ASReview项目,正是将主动学习原理应用于系统文献综述这一具体场景,通过

weixin_28725959的博客 432

Understand Qemu TCG

The whole executing process of QEMU main() //vl.c main_loop() //vl.c  x86_cpu_realizefn() //实例化虚拟机CPU设备模型 qemu_init_vcpu() //KVM没有enable,并且启用了TCG的情况下,tcg_enabled() qemu_tcg_init_vcpu()//启动VCPU线程,线程处

六六哥的博客 2145

在 SAP ABAP 里可靠地对接 FTP 服务器:从连接、命令到传输与排错的完整实战

本文详细介绍了在SAP ABAP中实现FTP文件交换的完整技术方案。文章首先解析了FTP协议的双连接特性(控制连接与数据连接),强调保持控制连接的重要性。随后详细说明了ABAP中FTP操作的四步标准流程:建立连接(包含HTTP_SCRAMBLE加密)、执行命令、断开连接和关闭RFC通道。文章提供了实战案例代码,演示如何将FTP文件复制到应用服务器再读取进内表处理,特别指出后台作业与前台操作的关键差异。最后总结了常见错误排查要点,包括连接模型、路径设置和资源释放等问题。全文通过SAP标准函数模块的调用顺序、典

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 308

allegro如何设置走线等长

设置走线等长!

weixin_42499230的博客 6933

EPT和VPID简介

EPT(Extended Page Tables,扩展页表),属于Intel的第二代硬件虚拟化技术,它是针对内存管理单元(MMU)的虚拟化扩展。EPT降低了内存虚拟化的难度(与影子页表相比),也提升了内存虚拟化的性能。从基于Intel的Nehalem架构的平台开始,EPT就作为CPU的一个特性加入CPU硬件中了。和运行在真实物理硬件上的操作系统一样,在客户机操作系统看来,客户机可用的内存空间也是一个从零地址开始的连续的物理内存空间。

czw 1230

使用 Python 实现基于 AGA8 GERG - 2008 方程计算掺氢天然气压缩因子的示例代码

AGA8 GERG - 2008 方程是用于计算天然气混合物热力学性质的一种方法,下面是一个使用 Python 实现基于 AGA8 GERG - 2008 方程计算掺氢天然气压缩因子的示例代码。需要注意的是,AGA8 GERG - 2008 方程非常复杂,完整实现需要大量的系数和详细的计算步骤。这里我们简化了部分过程,使用CoolProp库来完成计算,因为CoolProp已经实现了 GERG - 2008 方程。

AI的内部世界的博客 887

xhyve内存管理原理:guest物理地址空间映射机制

xhyve作为macOS上的轻量级虚拟化解决方案,其核心优势在于高效的内存管理机制。本文将深入解析xhyve如何通过guest物理地址空间映射实现高性能虚拟化,特别是其基于Hypervisor.framework的嵌套分页技术。🚀 ## xhyve内存管理架构概述 xhyve的内存管理架构建立在macOS的**Hypervisor.framework**之上,这个框架为xhyve提供了直接访

gitblog_00112的博客 656

决策变量乘积项的线性化

介绍了决策变量相乘情况下的线性化,并用案例进行线性化演示,其中针对连续变量相乘的情况介绍了McCormick包络的近似线性化方法

Linshaodan520的博客 1843

第9.3章 从CMake基础到自动驾驶实战:构建跨平台C/C++项目的全能指南

《CMake构建实战:项目开发卷》精要指南 本文系统梳理了许宏旭《CMake构建实战》核心内容,涵盖C++构建全流程: 基础构建:详解MSVC/GCC编译器使用、Makefile编写及静态/动态库构建方法 CMake核心:解析语法结构、变量控制、文件操作等关键命令,阐述项目全生命周期管理 实战应用:通过快速排序、手写数字识别项目演示现代CMake实践,特别针对自动驾驶领域给出多传感器融合、SLAM等场景的CMake配置方案 特色价值:本书填补了官方文档实例不足的空白,提供300+代码示例,是掌握工业级C++

行知SLAM 1343

How to debug QEMU

STEP 1: add a gloabcontrol variable before main in vl.c. we will stop on main() if the controlvariable is zero   int g_stop_here = 1; int main(int argc, char **argv, char **envp){ ......          

六六哥的博客 3143

系统架构最佳实践 -- 统一身份认证系统

设计和实现一个高效、安全的统一身份认证系统需要考虑到系统架构设计、用户认证与授权、用户身份管理、安全性保障、日志记录与审计、高可用性与容错性,以及用户体验优化等多个方面。通过合理的架构设计、安全措施和用户体验优化,可以构建一个满足用户需求、提供安全可靠的身份认证服务的系统。本文将总结统一身份认证系统的架构设计与实践经验,帮助读者了解如何设计和实现一个高效、安全的统一身份认证系统。统一身份认证系统应支持详细的日志记录和审计功能。通过合理的身份认证策略和授权机制,可以确保用户身份的准确性和信息的安全性。

xiaoli8748的专栏 1707

TCG Software Stack 简介

TCG Software Stack 简介 http://blog.sina.com.cn/s/blog_48b828860100k3el.html 自己总结了一下TSS的相关资料,简介一共分为五大部分: 1. TPM Internals 2. TPM Device Driver(TDD) 3. TCG Device Driver Library(TDDL) 4. TCG

J.A.Y的专栏 5586

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

Spring Boot 数据源与 MyBatis(-Plus) 自定义配置详解

本文详解 Spring Boot 中单数据源环境下 HikariCP 与 MyBatis-Plus 的自定义配置。通过手动声明 SqlSessionFactory,实现下划线转驼峰、日志输出、一级缓存策略等精细化控制。结合 HikariCP 核心参数调优(如最大连接数、连接生命周期),确保高性能与稳定性。适用于仅需访问单一数据库的场景,避免多数据源复杂性,兼顾性能与可维护性。

BADAO_LIUMANG_QIZHI的博客 199

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

Java EE 进阶:8.MyBatis 操作数据库(入门)(第一弹)

Java EE 进阶:8.MyBatis 操作数据库(入门)(第一弹)

要努力去发光,而不是被照亮~ 130

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

Docker Compose:搭建本地多服务开发环境

从一个 Java API、PostgreSQL 和 Redis 开始,配置服务名、端口、环境变量、健康检查、数据卷和依赖关系。理解 Compose 文件如何被解析、项目如何隔离,以及哪些数据不能依赖“重建容器”保留,能够把个人开发环境整理成团队可复用的启动入口。

m0_62221377的博客 461

AI全栈实战 | 3.9-01 爬虫入门:requests 加 BeautifulSoup 三分钟跑通,但 90% 的人栽在这 4 个“礼貌“问题上

⚠️:本文内容仅用于。请遵守目标站点的服务条款与相关法律法规,不得对目标服务造成负担,不得采集、传播个人隐私数据。技术是中性的,边界在你手里。爬虫的入门技术(requests 发请求 + BeautifulSoup 解析)三分钟就能学会。真正区分"会用爬虫"和"会做爬虫的人"的,是这篇我们跑通"请求→解析→存储"的最小闭环,然后重点把"合规与礼貌"这根弦给你绷上。

源码获取 | 运行部署 | 定制二开修改,如果回复不及时请耐心等待,请见谅。 411

数据库主键选型指南:BIGINT vs VARCHAR

主键选型关乎数据库性能与架构演进。BIGINT(如雪花算法)在顺序写入、二级索引开销和分布式生成上优势显著,适合高并发核心链路;而传统 VARCHAR UUIDv4 因随机性导致频繁页分裂、存储膨胀,性能堪忧。UUIDv7 通过时间戳有序性实现高效追加写入,结合 BINARY(16) 存储可兼顾性能与安全,成为现代微服务新选择。关键在于:主键应稳定、无业务含义,优先选用趋势递增的紧凑类型,并根据场景合理采用双主键模式或 ULID 等替代方案。

小李同学的博客 301

自动化运维选型:四条技术路线的能力边界,以及它们为什么不能互相替代

自动化运维怎么选型?拆解配置管理、基础设施即代码、作业调度与场景化编排四条技术路线边界,分析账本归属与时间语义差异,给出四种架构组合与判断点,帮企业看清为何不能互相替代。

trainsignalcn的专栏 327

C++算法(七)

C++ stack算法题和一些客观题

2503_94479566的博客 370

不用再为文本搜索单独维护一套系统!全文检索深度解析

为了给商品、客服工单或者企业知识库增加一个搜索框,企业往往需要在业务数据库之外,再部署一套Elasticsearch。数据库保存商品、订单和用户等真实业务数据,搜索引擎保存另一份文本索引;两套系统之间,还需要通过CDC、消息队列或者同步程序持续传输数据。一个看似简单的搜索需求,最后可能变成两套集群、两份数据和一条必须保持稳定的数据链路。由此产生的问题并不少:数据库已经完成更新,搜索结果却可能尚未同步;业务查询同时涉及文本、库存、权限和订单状态时,应用需要在两个系统之间来回组合结果;

TiDB 社区干货传送门 252

IDEA 简介:从零认识 IntelliJ IDEA

IDEA 全称,是由 JetBrains 公司开发的一款主流 Java 集成开发环境(IDE)。它集代码编辑、编译、调试、测试、版本控制、构建管理等功能于一体,被大量 Java 开发者视为日常开发的首选工具。所谓 IDE(Integrated Development Environment,集成开发环境),就是把写代码所需的各类工具整合到同一个界面中。相比只用文本编辑器加命令行编译,IDE 能显著减少重复操作,让开发者把精力集中在业务逻辑上。

ztI10的博客 153

48-逻辑结构表空间段区块

默认 10%,意思是块里的空闲空间低于 10% 时就不再插入新行,留着给已有行的 UPDATE 变胖用。注意 INSERT 过程中每次申请新区,都是一次潜在的空间报错点,如果表空间满了,此刻就会抛 ORA-01653。剩下的空间被谁占了?段的每个区可以落在表空间的任一数据文件,所以 2T 的表在 32G 单文件上限(smallfile)的世界里照样能活——多加文件就行。,一张只有两个 CLOB 字段的表,实际在库里是三个段(表段 + 两个 LOBSEGMENT),空间统计漏算 LOB 段是新手常犯的错。

yuhou25的博客 286

市场调查与统计分析专业大学期间考证怎么安排?

市场调查与统计分析专业的考证规划,适合从一份完整的调查报告倒推:能不能设计问卷、判断样本是否合理、清洗数据,再把分析结果转化为业务建议?围绕这条能力链安排证书,比单纯按“热门程度”报名更有针对性。结合2026年的学习安排,并为2027年的实习、升学和求职预留时间,大学期间可以重点考虑六类证书:全国计算机等级考试证书、大学英语四级或六级成绩报告单、CDA数据分析师、初级统计专业技术资格证书、微软办公软件国际认证中的Excel相关证书,以及软考数据库系统工程师资格证书。

cc572502653的博客 158

Oracle 19c 在线重定义后旧表空间清理及 ASM 存储资源回收 SOP

Oracle 19c 在线重定义后旧表空间清理与 ASM 存储资源回收 SOP

「YYL DBA手记」 数据库 · 架构 · 运维 · 实战 yyldba.blog.youkuaiyun.com 487
上一篇: kvm_emulate_hypercall代码解析()
下一篇: qemu日志系统添加分析
inquisiter
博客等级 码龄10年 374粉丝 228原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值