qemu ept设置过程

qemu-kvm 内存虚拟化---ept qemu-kvm内存虚拟化 内存虚拟化实际就是进行地址转换从客户机虚拟地址-->客户机物理地址-->宿主机的物理地址,转换实现有两种硬件内存虚拟化和软件影子页表方式, 下面主要分析基于intel ept硬件内存虚拟化实现,此实现主要做两件事情 1.开启ept功能2.构造转换页表。注意该页表构造采用动态方式(常说懒惰方式),就是不到完不得以情况不创建。此页表创建实现就是采用ept violati 阅读详情

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.c → hvf_set_phys_mem():将 QEMU 内存区域映射到 HVF 的 GPA 空间。
  2. EPT 映射:
    target/i386/hvf/x86hvf.c → hv_vm_map():调用 Hypervisor 接口设置 EPT 项。
  3. EPT 违规处理:
    target/i386/hvf/hvf.c → ept_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)时临时设置只读权限,捕获写操作后复制页。

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

qemu-kvn 内存虚拟化---ept qemu-kvm内存虚拟化 内存虚拟化实际就是进行地址转换从客户机虚拟地址-->客户机物理地址-->宿主机的物理地址,转换实现有两种硬件内存虚拟化和软件影子页表方式, 下面主要分析基于intel ept硬件内存虚拟化实现,此实现主要做两件事情 1.开启ept功能2.构造转换页表。注意该页表构造采用动态方式(常说懒惰方式),就是不到完不得以情况不创建。此页表创建实现就是采用ept violati 阅读详情

相关推荐

从春岚看QEMU/KVM虚拟机逃逸:VMX、EPT与PWN利用链全解析

虚拟机逃逸是虚拟化安全中的核心挑战,它涉及CPU虚拟化、内存模拟和设备模型等多个底层机制。在QEMU/KVM架构中,VMX扩展和VMCS结构负责管理CPU状态切换,而EPT则完成从客户机物理地址到宿主机物理地址的二次翻译。理解这些原理是分析逃逸漏洞的基础。常见的CTF题目如ByteCTF 2021的“春岚”,通过一个设备模拟中的栈溢出漏洞,引导攻击者从guest内发起out指令,触发VM exit,进而控制QEMU进程并利用mmap覆盖PML4页表,最终实现任意内存读写和宿主机逃逸。本文结合PWN实战,梳理

weixin_33861800的博客 438

Qt Debug Assertion Failed 报错

我想要的目的 我是想批量往一个布局器中写入控件,QLabel,QWidget都有,大概二十个,一行一行的写太费劲了。 Qt Debug Assertion Failed!报错原因 估计是野指针或者是内存泄漏,因为我用数组经常就有内存访问越界的问题。如图: 我的出错代码 QVBoxLayout* layout = new QVBoxLayout;//new了一个布局器 QLabel* labels = new QLabel[3];//这里new了一个三个QLabel的数组; QStr

qq_40944337的博客 3105

KVM内存虚拟化实战:从GVA到HPA的完整转换流程解析(附EPT技术详解)

本文深入解析了KVM内存虚拟化的核心机制,重点剖析了从客户机虚拟地址(GVA)到宿主机物理地址(HPA)的完整转换流程。通过实战拆解QEMU-KVM 6.2版本,详细阐述了Intel EPT(扩展页表)技术如何通过硬件加速实现高效转换,并探讨了NUMA架构下的内存性能优化实践,为构建高性能虚拟化环境提供指导。

yhn456789的博客 714

QEMU之内存虚拟化

qemu之内存虚拟化

大吉 2807

qemu-kvm内存虚拟化的原理及其流程

1.内存虚拟化技术实现原理 内存虚拟化其实就是关于如何做Guest虚机到host宿主机物理内存之间的各种地址转换,KVM经历了三代的内存虚拟化技术,大大加快了内存的访问速率。 先看看虚拟化环境和非虚拟化环境,内存分配的差异: 非虚拟化环境,内存分配时逻辑地址需要转换为线性地址,然后由线性地址转换为物理地址。 逻辑地址 ==> 线性地址 ==> 物理地址 虚拟化环境下,由于qemu-kvm进程在宿主机上作为一个普通进程,那对于Guest而言,需要的转换过程就是这样: ...

hzj_001的博客 5527

Qemu-kvm的ioeventfd创建与触发的大致流程

在使用virtio-blk的情况时,virtio notify使用的ioeventfd机制,原因是为了提高性能,能够较快速的回到guest中运行。具体是如何建立这个ioeventfd的呢?流程理出来了,细节没看:

慢慢游 5775

EPT学习总结及KVM的处理

EPT为了提升虚拟化内存映射的效率而提供的一项技术。打开EPT后,GuestOS运行时,通过页表转化出来的地址不再是真实的物理地址,而是被称作为guest-physical addresses,经过EPT的转化后才成为真实的物理地址。如果CR0.PG=0,GuestOS分页机制没有打开,直接使用线性地址作为guest-physical addresses,如果CR0.PG=1,使用分页机制转化后的地址作为guest-physical addresses。EPT的表和页表基本类似,具体可以参见Intel的编程

jemmy858585的专栏 2987

MMIO, RAM PageTable of Guest

在 Guest系统中IO访问可能分三种: 1,guest 内部执行PMIO指令,guest 会触发VM_EXIT,退出状态是KVM_EXIT_IO; 2,guest内部执行对MMIO空间的访问,guest 会触发VM_EXIT,退出状态将是KVM_EXIT_MMIO; 3,guest 内部对ram物理内存的访问,会通过EPT硬件(x86)转化为HPA,进而完成对物理内存的读写(但如果是第一次访问由于EPT页表不存在,会发生EPT_VIOLATION,触发VM_EXIT进而建立EPT表项); MMIO

yiyeguzhou100的专栏 1315

kvm性能优化方案---cpu/内存/磁盘/网络

kvm性能优化 kvm性能优化,主要集中在cpu、内存、磁盘、网络,4个方面,当然对于这里面的优化,也是要分场景的,不同的场景其优化方向也是不同的,下面具体聊聊这4个方面的优化细节。 cpu 在介绍cpu之前,必须要讲清楚numa的概念,建议先参考如下两篇文章 CPU Topology 玩转cpu-topology 查看cpu信息脚本: #!/bin/bash # Simple p

简单生活 2万+

QEMU源码全解析 —— 内存虚拟化(1)

QEMU源码全解析 —— 内存虚拟化(1)

phmatthaus的专栏 2562

KVM EPT页表

KVM在vcpu创建时创建和初始化MMU, kvm_vm_ioctl kvm_vm_ioctl_create_vcpu kvm_arch_vcpu_create kvm_mmu_create(vcpu) vcpu->arch.mmu = &vcpu->arch.root_mmu; vcpu->arch.walk_mmu = &vcpu->arch.root_mmu; __kvm_mmu_cr

yiyeguzhou100的专栏 1820

kvm qemu vhost-user

一. QEMU 和 KVM 之间 Linux code kvm_types.h 中 有关于对各个地址的描述 /* * Address types: * * gva - guest virtual address * gpa - guest physical address * gfn - guest frame number * hva - host virtual a

tiexueqiangzhu的博客 1427

聚类模型-层次聚类

聚类模型 1、层次聚类 2、原型聚类-K-means 3、模型聚类-GMM 4、EM算法-LDA主题模型 5、密度聚类-DBSCAN 6、图聚类-谱聚类 一、层次聚类 一、聚类理论 ​ 一般来说,聚类是在训练样本的标签信息不知的情况下,学习样本内在的性质和规律,将有限的集合划分成ccc类。根据“方以类聚,物以群分”的思想,类内对象尽可能的相似,...

myazi 6504

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

的流程,涵盖了 QEMU 中 x86 CPU 的初始化、vCPU 线程启动、客户机代码执行及内存虚拟化异常处理的核心路径。在 QEMU 的 x86 虚拟化实现中,CPU 的初始化与执行流程涉及多个关键函数,从 CPU 设备的最终初始化(方法,负责完成 CPU 的最终初始化(如设置 CPU 型号、检查特性兼容性、注册热插拔逻辑等)。为每个虚拟 CPU 创建执行线程,并绑定到加速器(如 HVF/KVM)的后端操作。)到虚拟机监控程序(HVF)中处理 EPT(扩展页表)缺页异常(是 x86 CPU 设备的。

inquisiter 1145

MATLAB控制信号发生器(USB-GPIB-HS)GPIB仪器控制教程(含matlab代码)

自动化测试时需要自动产生信号,通过matlab控制信号发生器的频率与功率,以实现自动化信号生成输出

qq_43686057的博客 1606

(实战)[re:Invent 2018]-001:赛道分析-(致敬1024)

打印log

Rainbow 2780

wpf在page中如何切换page_关于QEMU中对EPT实现机制

首先开宗明义:在QEMU中,当processor进入VM环境,对基于EPT机制的内存虚拟化是完全支持的,当VM中的GuestOS在执行内存访问操作时,会通过EPT-page-structure将linear-address先转换成guest-physical-address,然后再将guest-physical-address转换成实际的物理地址physical-address;得到了最终的实际物...

weixin_39688750的博客 293

AI驱动Spine骨骼动画生成:从图像拆分到动画自动化的全流程解析

计算机视觉与生成式AI技术正深度赋能传统数字内容生产流程。在2D动画制作领域,骨骼动画技术通过模拟真实生物关节运动,实现了角色动画的高效制作与灵活控制。其核心原理在于将角色拆分为独立部件,通过骨骼层级关系驱动部件变换,结合关键帧插值算法生成流畅动作。这项技术的工程价值在于大幅降低动画制作门槛,提升内容生产效率,尤其适用于游戏开发、影视预演、广告设计等需要快速原型迭代的场景。本文聚焦于如何利用SIFT特征匹配、RANSAC几何验证等CV算法实现部件自动对位,并结合动画12原则的程序化实现,构建从单张角色立绘到

weixin_28696185的博客 1519

配置管理中的白名单机制怎么实现_关于QEMU中对EPT实现机制

首先开宗明义:在QEMU中,当processor进入VM环境,对基于EPT机制的内存虚拟化是完全支持的,当VM中的GuestOS在执行内存访问操作时,会通过EPT-page-structure将linear-address先转换成guest-physical-address,然后再将guest-physical-address转换成实际的物理地址physical-address;得到了最终的实际物...

weixin_35517006的博客 446

自动驾驶仿真:Carsim、NI和VTD联合仿真课题二

文章目录前言一、设备配置1、硬件需求2、网络配置二、Carsim工程配置1、创建工程2、创建数据库3、参数配置三、VTD工程配置1、创建工程四、Veristand工程配置1、创建工程五、运行程序 前言 上篇文章《Carsim、NI和VTD联合仿真课题一》简单地介绍了三者之间的联合框架,以及NI与VTD之间简单的组包与拆包指导。这篇文章将要讲述的是如何将三个软件联合起来,如何设置软件参数,用最简单的方法把仿真车开起来。 一、设备配置 1、硬件需求 注:真正的做智能驾驶仿真项目,至少需要两台电脑,一台实时机

zataji的博客 1万+

VMware使用Windows、WinXP等虚拟机上不了网的解决办法(管用)

这个情况一般出现在可以插网线的电脑上,比如台式机和有网线插口的笔记本。需要转换器才能插网线的笔记本一般不会出现这种情况. 查看主机的IP地址和虚拟机的IP地址是否在同一网段,如果在的话,虚拟机就能上网了!!(备注:虚拟机中的IP地址一定要和主机中的用来上网的那个连接的IP地址相同哦)。

爱吃雪糕的小布丁的博客 1万+

qemu-kvm源码解析-内存虚拟化

qemu kvm virtual memory

xiyanxiyan10的专栏 1297

工业4.0必备:C#上位机+数字孪生 生产线实时监控与智能预警系统(工业级实战)

数据割裂:PLC、传感器、工业相机的数据散落在不同系统,想看全局生产状态要切换N个软件,“数据孤岛”导致决策滞后;故障难预判:设备突发故障时,只能停机排查,平均故障响应时间超30分钟,一条生产线停工1小时损失超10万;可视化差:传统监控只有冰冷的数字和2D图表,设备运行状态、生产流程、物料流转无法直观感知,新人上手需3个月才能熟悉产线。

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 660

qemu-kvm 对mmio的模拟

转:http://blog.chinaunix.net/uid-28541347-id-5789579.html MMIO和PIO的区别 I/O作为CPU和外设交流的一个渠道,主要分为两种,一种是Port I/O,一种是MMIO(Memory mapping I/O)。 前者就是我们常说的I/O端口,它实际上的应该被称为I/O地址空间。 对于x86架构来说,通过IN/OUT指令访问。PC架构一共有...

weixin_42681961的博客 3158

CT探测器普遍采用“星形拓扑+多ADC模组”架构的TDC(时间数字转换器)设计方案

本文提出一种基于TDC反馈机制的CT探测器时钟同步方法,通过延时测量、偏差计算和动态补偿三步硬件流水线,实现高精度同步。系统采用Xilinx Kintex UltraScale FPGA内置CARRY8进位链构建3.5ps分辨率的TDC,结合多级比较器和延迟单元,形成闭环反馈控制。实验表明,在512通道、1.28m传输距离下,同步精度稳定在10ps以内,较传统方案提升两个数量级,并能动态补偿干扰抖动。该方案解决了传统方法在CT旋转腔体环境下精度不足的问题,为下一代超高清CT提供了有效的时钟同步解决方案。

whm128的博客 274

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

KVM内存虚拟化实战:从GVA到HPA的地址转换全解析(含EPT技术详解)

本文深入解析KVM内存虚拟化核心技术,重点剖析了硬件辅助虚拟化中的EPT(扩展页表)技术如何实现从客户机虚拟地址(GVA)到宿主机物理地址(HPA)的高效转换。通过结合QEMU-KVM架构的实战分析,详细阐述了EPT的工作原理、缺页异常处理流程,并提供了性能监控与调优指南,帮助读者构建从理论到实践的完整知识体系,以优化虚拟机内存访问性能。

pca5navigator的博客 845

VB摄像头监控

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

上一篇: qemu日志系统添加分析
下一篇: linux内核 kvm_mmu_page_fault 分析
inquisiter
博客等级 码龄10年 374粉丝 228原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值