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

CTF-PWN-QEMU-前置知识

文章目录

  • QEMU 内存管理(QEMU 如何管理某个特定 VM 的内存)
    • MemoryRegion gpa->hpa
    • FlatView:表示MR 树对应的地址空间
    • FlatRange:存储不同MR对应的地址信息
    • AddressSpace:不同类型的 MemoryRegion树
    • RAMBlock
    • 总体简化图
  • QEMU 设备模拟 (QEMU的模拟IO设备如何与VM交互)
    • QEMU 设备 IO 处理

QEMU 内存管理(QEMU 如何管理某个特定 VM 的内存)

QEMU:能够完成gva-gpa=hva-hpa地址的转换

MemoryRegion gpa->hpa

QEMU通过MemoryRegion管理虚拟机内存,每个MemoryRegion对应虚拟机一部分内存,同时还有相关对应Host的虚拟内存相关信息。不同MemoryRegion通过树状组织连接起来,连接到根MemoryRegion下,不同MemoyRegion树代表不同作用的内存,如系统内存空间(system_memorry)或IO内存空间(system_io)

MemoryRegion可以分为以下三种类型

  • 根级MemoryRegion:通过memory_region_init初始化,只是个管理用的(如system_memory),没有自已对应的部分内存
  • 实体MemoryRegion:通过memory_region_init_ram初始化,有对应的内存,大小为size
  • 别名 MemoryRegion:通过 memory_region_init_alias 初始化,没有自己对应的内存,作为一个实体的别名存在,通过alias成员指向对应的实体,alias_offset代表该别名MemoryRegion所代表内存起始GPA相对于实体 MemoryRegion 所代表内存起始GPA的偏移量

FlatView:表示MR 树对应的地址空间

struct FlatView {struct rcu_head rcu;unsigned ref;FlatRange *ranges;unsigned nr;unsigned nr_allocated;struct AddressSpaceDispatch *dispatch;MemoryRegion *root;
};

FlatRange:存储不同MR对应的地址信息

struct FlatRange {MemoryRegion *mr;hwaddr offset_in_region;AddrRange addr;uint8_t dirty_log_mask;bool romd_mode;bool readonly;bool nonvolatile;
};

AddressSpace:不同类型的 MemoryRegion树

两种,为address_space_memory 与 address_space_io

/*** struct AddressSpace: describes a mapping of addresses to #MemoryRegion objects*/
struct AddressSpace {/* private: */struct rcu_head rcu;char *name;MemoryRegion *root; //是对应树的根/* Accessed via RCU.  */struct FlatView *current_map; //对对应树的地址空间表示int ioeventfd_nb;struct MemoryRegionIoeventfd *ioeventfds;QTAILQ_HEAD(, MemoryListener) listeners;QTAILQ_ENTRY(AddressSpace) address_spaces_link;
};

RAMBlock

MR 对应的 Host 虚拟内存,每个RAMBlock表示单个实体MemoryRegion所占的Host虚拟内存信息,多个RAMBlock构成RAMList
每个RAMBlock都有一个唯一的MemoryRegion对应

总体简化图

大佬勿喷,后续学的更深会完善
在这里插入图片描述

QEMU 设备模拟 (QEMU的模拟IO设备如何与VM交互)

QEMU 在用户空间中独立进行设备模拟,虚拟设备被其他的 VM 通过 VMM 提供的接口进行调用。并且设备的模拟是独立于VMM

QEMU 设备 IO 处理

当VM访问某虚拟设备的物理内存/端口时候,控制权由VM转交到VMM,此时QEMU会根据触发VM-exit的事件类型进行不同的处理,即MMIO还是PMIO。
MMIO:对address_space_memory类的地址空间读写
PMIO: 对address_space_io类的地址空间进行读写

http://www.lryc.cn/news/240968.html

相关文章:

  • iEnglish全国ETP大赛:教育游戏助力英语习得
  • 租车系统开发/多功能租车平台微信小程序源码/汽车租赁系统源码/汽车租赁小程序系统
  • Nevron Vision for .NET 2023.1 Crack
  • 基于Python的新浪微博爬虫程序设计与实现
  • Java架构师发展方向和历程
  • CUDA与GPU编程
  • C# 执行Excel VBA宏工具类
  • acwing算法基础之数学知识--求组合数基础版
  • SpringBoot中的classpath都包含啥
  • 新王加冕,GPT-4V 屠榜视觉问答
  • python之TCP的网络应用程序开发
  • Axios 拦截器 请求拦截器 响应拦截器
  • Mysql Shell笔记
  • Hive日志默认存储在什么位置?
  • Kafka 常用功能总结(不断更新中....)
  • 单链表相关面试题--5.合并有序链表
  • SV-7042VP sip广播4G无线网络号角
  • 基于OpenCV+MediaPipe的手势识别
  • YOLO目标检测——无人机航拍行人检测数据集下载分享【含对应voc、coc和yolo三种格式标签】
  • 数据提取PDF SDK的对比推荐
  • 【数据结构(C语言)】浅谈栈和队列
  • 【NGINX--5】身份验证
  • 【网络奇缘】- 计算机网络|分层结构|ISO模型
  • 使用whisper实现语音转文本
  • Django中间件与csrf
  • 【搜维尔科技】产品推荐:Virtuose 6D RV,大型工作空间触觉设备
  • <JavaEE> 什么是线程(Thread)?进程和线程有什么区别?
  • 【赠书第7期】从零基础到精通Flutter开发
  • 《golang设计模式》第三部分·行为型模式-07-观察者模式(Observer)/发布者—订阅者模式
  • Maven中常用命令以及idea中使用maven指南