MemoryRegion模型原理,以及同FlatView模型的关系(QEMU2.0.0)

版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/leoufung/article/details/48781205
一、MemoryRegion模型
QEMU通过MemoryRegion来管理虚拟机内存,通过内存属性,GUEST物理地址等特点对内存分类,就形成了多个MemoryRegion,这些MemoryRegion 通过树状组织起来,挂接到根MemoryRegion下。每个MemoryRegion树代表了一类作用的内存,如系统内存空间或IO内存空间。MemoryRegion模型如下图所示,蓝色的部分代表了真实的物理内存 

MemoryRegion模型原理,以及同FlatView模型的关系(QEMU2.0.0) - 六六哥 - 六六哥的博客
 
为了方便描述,我将MemoryRegion分为三类:
1. 根MemoryRegion:        不分配真正的物理内存,通过subregions将所有的子MemoryRegion管理起来,如图中的system_memory
2. 实体MemoryRegion:      这种MemoryRegion中真正的分配物理内存,最主要的就是pc.ram和pci。分配的物理内存的作用分别是内存、PCI地址空间以及fireware空间。QEMU是用户空间代码,分配的物理内存返回的是HVA,被保存到host域。同时这个结构还会为本段虚拟机内存分配虚拟机物理地址空间起始地址,该起始地址(GPA)保存到ram_addr域,该段内存大小为size。通过实体MemoryRegion就可以将HOST地址HVA和GUEST地址GPA对应起来,这种实体MemoryRegion起到了转换的作用。
3. 别名MemoryRegion:      这种MemoryRegion中不分配物理内存,代表了实体MemoryRegion的一个部分,通过alias域指向实体MemoryRegion,alias_offset代表了该别名MemoryRegion所代表内存起始GPA相对于实体MemoryRegion所代表内存起始GPA的偏移量,通常用来计算别名MemoryRegion对应的物理内存的HVA值:HVA = 起始HVA + alias_offset。如图中的ram_above_4g和ram-below-4g

所有实体MemoryRegion都会被插在主板上,如上图pc.ram就被插在I440FX主板的ram_memory成员中


二、FlatView模型


三、MemoryRegion模型和FlatView模型的关系

MemoryRegion是QEMU管理内存的树状结构,便于按照功能、属性分类;但这只是管理结构。但虚拟机的内存需要通过KVM_SET_USER_MEMORY_REGION,将HVA和GPA的对应关系注册到KVM模块的memslot,才可以生效成为EPT。如果QEMU直接使用MemoryRegion进行注册,那么注册的过程将会很麻烦,也容易不断的出现重叠判断等。所以在通过KVM_SET_USER_MEMORY_REGION注册前,加了一层转换机制,先将树状的MemoryRegion展开物理内存样子的一维区间结构,然后再通过KVM_SET_USER_MEMORY_REGION将这个展开的物理内存注册到KVM内核模块中,就方便了许多。这个转换机制就是FlatView模型。整个转换过程请参见函数address_space_update_topology,后面会再写博客进行详细分析。FlatView模型见下图所示

MemoryRegion模型原理,以及同FlatView模型的关系(QEMU2.0.0) - 六六哥 - 六六哥的博客
 

address_space_update_topology将指定的AddressSpace下的MemoryRegion树进行展平,形成了对应一维内存逻辑表示的FlatView,然后再address_space_update_topology_pass中将FlatView模型通过KVM_SET_USER_MEMORY_REGION注册到KVM模块中。

参考文章

展开阅读全文

模型关系之多对多简介

05-08

<div style="text-align:center;">rn <span style="font-size:16px;"><strong>Python框架Djanggo从入门到实战教程</strong></span> rn</div>rn<p>rn <span style="font-size:16px;"><br />rn</span> rn</p>rn<p>rn <span style="font-size:16px;">Django是一个高级Python Web框架, 鼓励快速,简洁, 以程序设计的思想进行开发. 通过使用这个框架, 可以减少很多开发麻烦, 使你更专注于编写自己的app, 而不需要重复造轮子. Django免费并且开源。</span> rn</p>rn<br />rn<p>rn <span style="font-size:16px;">本教程<strong>从浅入深,不仅有知识点的讲解,还有项目实战!</strong>非常值得学习,纵观全网,本教程知识点最详细,不但有知识点的讲解,还会讲项目,项目实战和企业需求匹配!</span> rn</p>rn<p>rn <span style="font-size:16px;"><br />rn</span> rn</p>rn<p>rn <span style="font-size:18px;background-color:#FFFFFF;color:#E53333;"><strong>本课程的亮点在其项目,是真正的企业级项目,重磅级项目,在找工作的时候为你加分!</strong></span> rn</p>rn<br />rn<span style="font-size:16px;">本教程全面带你了解Djanggo框架</span><br />rn<span style="font-size:16px;">1、Django基础</span><br />rn<span style="font-size:16px;">2、Django进阶</span><br />rn<span style="font-size:16px;">3、Django模板引擎</span><br />rn<p>rn <span style="font-size:16px;">4、实战案例</span> rn</p>rn<p>rn <span style="font-size:16px;"><br />rn</span> rn</p>rn<p>rn <span style="font-size:16px;"><br />rn</span> rn</p>rn<br />rn<div>rn <br />rn</div>

没有更多推荐了,返回首页