当前位置: 首页 > news >正文

qemu ept设置过程


QEMU 设置 EPT(Extended Page Table)的过程解析

qemu_init
	configure_accelerators
	    do_configure_accelerator
	        accel_init_machine
	            kvm_init(init_machine)
	                kvm_memory_listener_register
	                    memory_listener_register
	                        listener_add_address_space
	                            hvf_region_add
	                                hvf_set_phys_mem
	                                    do_hvf_set_memory
	                                        hv_vm_map

x86_cpu_realizefn
    qemu_init_vcpu
        kvm_start_vcpu_thread  (create_vcpu_thread)
            kvm_vcpu_thread_fn
                kvm_cpu_exec
                    kvm_arch_handle_exit

main()                     // QEMU 入口函数
  qemu_init()              // 初始化虚拟机
    machine_run_board_init()      //pc_init_isa
      pc_init1()           // x86 机器初始化
        pc_cpus_init()     // 创建所有 CPU 对象
          x86_cpu_new()    // 实例化 X86CPU 对象
          	qdev_realize
          		device_set_realized()  // 标记设备为“已实现”
            		dc->realize()  // 调用 x86_cpu_realizefn

pc_init1
    pc_memory_init
        pc_system_firmware_init
            pc_system_flash_map
                kvm_memcrypt_encrypt_data
                    sev_encrypt_data  (kvm_state->memcrypt_encrypt_data)
                        sev_launch_update_data

在基于 Intel VT-x 的虚拟化环境中,EPT(扩展页表)负责将 客户机物理地址(GPA) 转换为 宿主机物理地址(HPA)。QEMU 与 Hypervisor(如 macOS 的 HVF 或 Linux 的 KVM)协作,通过以下步骤完成 EPT 的配置:


1. EPT 初始化

  • 触发时机:虚拟机启动时,QEMU 与 Hypervisor 初始化虚拟化环境。
  • 关键操作
    • 调用 Hypervisor 接口(如 HVF 的 hv_vm_create)创建虚拟机上下文。
    • 分配并初始化 EPT 页表结构,通常由 Hypervisor 管理物理内存映射。

2. 内存区域映射

  • 客户机内存注册:QEMU 将虚拟机的内存区域(RAM、ROM、MMIO 等)通过 Hypervisor 接口映射到宿主机物理内存。
    // HVF 示例:将客户机物理地址范围映射到宿主机内存
    hv_vm_map(host_phys_addr, guest_phys_addr, size, memory_flags);
    
    • host_phys_addr:宿主机物理地址(HPA)。
    • guest_phys_addr:客户机物理地址(GPA)。
    • memory_flags:EPT 权限标志(如读/写/执行)。

3. 设置 EPT 权限

  • 内存类型与权限
    • RAM 区域:默认设置为可读、可写(HV_MEMORY_READ | HV_MEMORY_WRITE)。
    • MMIO 区域:标记为不可缓存(Uncacheable),权限可能限制为只读或无访问权限,以触发 EPT 违规并由 QEMU 模拟设备访问。
    • ROM 区域:根据配置设置只读权限。
  • 动态调整
    当虚拟机执行内存热插拔或动态调整内存保护(如写时复制)时,QEMU 通过 Hypervisor 更新 EPT 权限:
    hv_vm_protect(guest_phys_addr, size, new_flags);
    

4. 处理 EPT 违规

  • EPT Violation 触发
    当虚拟机访问未映射或权限不足的 GPA 时,CPU 触发 EPT Violation,陷入 Hypervisor。
  • QEMU 的响应
    Hypervisor 将事件传递给 QEMU,调用类似 ept_emulation_fault 的函数(如用户此前提供的代码)判断是否需要软件模拟:
    • MMIO 访问:返回 true,由 QEMU 设备模型模拟访问。
    • 正常 RAM 访问:返回 false,Hypervisor 可能自动修复 EPT 映射(如因大页拆分或脏页跟踪)。

5. 脏页跟踪与内存迁移

  • 写操作监控
    若内存区域标记为需要脏页跟踪(如 HVF_SLOT_LOG),QEMU 在 EPT 违规处理中调用 memory_region_set_dirty,记录被修改的页。
  • EPT 权限临时调整
    为捕获写操作,QEMU 可能暂时将 EPT 权限设为只读。当发生写操作触发 EPT Violation 时,标记脏页后恢复写权限。

关键代码路径(以 QEMU/HVF 为例)

  1. 内存初始化
    target/i386/hvf/hvf.chvf_set_phys_mem():将 QEMU 内存区域映射到 HVF 的 GPA 空间。
  2. EPT 映射
    target/i386/hvf/x86hvf.chv_vm_map():调用 Hypervisor 接口设置 EPT 项。
  3. EPT 违规处理
    target/i386/hvf/hvf.cept_emulation_fault():判断是否需模拟访问。

流程图解

QEMU 启动虚拟机
  │
  ├── 初始化 Hypervisor (hv_vm_create)
  │
  ├── 注册客户机内存区域 (hv_vm_map)
  │   ├── RAM → R/W 权限
  │   ├── MMIO → 无权限或只读
  │   └── ROM → 只读
  │
  ├── 虚拟机运行
  │   │
  │   └── EPT Violation 触发
  │       ├── 读/写权限不足 → ept_emulation_fault() 判断
  │       │   ├── 需模拟 → QEMU 处理(如 MMIO)
  │       │   └── 无需模拟 → Hypervisor 修复 EPT
  │       └── 指令提取违规 → 拒绝处理
  │
  └── 动态调整(内存热插拔、权限变更)

技术挑战与优化

  1. 性能优化
    • 大页支持:尽量使用 2M/1G 大页减少 EPT 层级,降低 TLB 未命中率。
    • EPT 缓存:Hypervisor 可能缓存 EPT 项以加速转换。
  2. 安全性
    • 隔离性:确保 EPT 映射严格隔离不同虚拟机的内存。
    • 权限控制:防止客户机越权访问宿主机内存。

典型应用场景

  • 设备模拟:MMIO 区域未映射到物理内存,EPT Violation 触发 QEMU 的设备模型响应。
  • 内存热迁移:通过脏页跟踪确定需同步的内存页。
  • 内存去重:写时复制(Copy-on-Write)时临时设置只读权限,捕获写操作后复制页。

若有具体代码或场景需要深入分析,可进一步探讨!

相关文章:

  • 三分钟掌握音频提取 | 在 Rust 中优雅地处理视频音频
  • 记录修复一个推拉门滑轮
  • 金仓KESV8R6任务调度
  • 使用 DeepSeek 训练定制化小说创作模型,所需本地数据量与模型规模、训练目标
  • 神经网络基础之正则化
  • 更改 vscode ! + table 默认生成的 html 初始化模板
  • 虚拟路由与单页应用(SPA):详解
  • 【Linux】Hadoop-3.4.1的伪分布式集群的初步配置
  • MiB和MB
  • 多层感知机
  • Java 输入1~100的整数,当读入负数时结束,统计输出每个数的数量
  • Linux中mutex机制
  • 如何在云端平台上建立 30,000 名用户的网页 MMO游戏环境-4 (OOM Killer 问题與雲平台!?)
  • AT_abc398_f [ABC398F] ABCBA
  • 哈尔滨工业大学DeepSeek公开课人工智能:从图灵测试到DeepSeek|附视频和PPT下载方法
  • 2025-03-22 学习记录--C/C++-C 库函数 - getchar()
  • [Android] ViiTor_Translate_2.2.5实时语音翻译软件,多国语言全解决
  • 数据库基础知识
  • React:React主流组件库对比
  • 分子动力学软件包Amber24的安装
  • 袁思达已任中国科学院办公厅主任
  • 远如《月球背面》,近似你我内心
  • 人民日报评外卖平台被约谈:合法规范经营,公平有序竞争
  • 75万买299元路由器后续:重庆市纪委、财政局、教委联合调查
  • 法治课|争议中的“行人安全距离”于法无据,考量“注意义务”才更合理
  • Manus向全球用户开放注册