在分析qemu的内存模型具体代码前我们先来说明一下

qemu要实现的内存管理是什么?

主要是两部分功能
1 gva->gpa->hva, gva代表guest的虚拟内存地址, gpa代表guest的物理地址, 而hva代表宿主机的虚拟地址, qemu使用宿主机的虚拟地址模拟guest的物理地址, gva->gpa 的转换主要模拟mmu实现。 而gpa->hva的转换是qemu工作的重点
2 内存布局的建模。x86的内存模型比较复杂, 主要包含三种类型的内存, rom内存,ram内存和 io内存。 这三种内存对于cpu来说,看到的内存地址中有两种,分别是内存地址空间和io地址空间。 对于io地址空间很简单,就是一个端口,一般都是比较段的内存片段。 内存地址空间呢, 如32位的处理器的寻址能力是4g, 也就是不管物理内存有多少,cpu都能看到这么大的地址空间。对于这4g的内存地址空间,分布也是比较复杂的,这些地址空间上不光有内存条的内存地址,还有各种设备的mmio地址(也就是设备地址映射到内存地址空间),另外还有rom的地址,也是在这4g的内存地址空间上。 这就导致了一个问题,内存的互相遮盖, 比如一个32位的处理器,它的寻址空间为4g,你有一个2g的内存条, 这2g的内存条占用的物理地址空间为0-2g,但是在这0-2g上由于历史原因,很多rom的地址空间也在这上面,比如vga的地址空间就在0-1m上面的一段地址。 另外设备的端口地址,也可以通过mmio映射到0-4g的内存空间上, 所以qemu要实现的内存模型必须具备一下这些能力:

  • 对于不同类型的内存地址的读写有不同的处理方式
    比如mmio部分对应于设备的寄存器,读写应该回调设备的回调函数
    ram对应的地址空间,只需要简单的写hva就可以了
    rom的对应的地址空间,读就直接写hva,而写应该被禁止(或者设备的回调函数)
  • 不同的内存设备可以在地址空间上重叠,内存控制器可以决定哪种设备的内存在地址空间上覆盖另一种设备的内存
  • mmu的模拟
  • gpa -> hva对应关系,给定gpa如何快速找到相应的hva(注意地址空间重合的部分,可能通过个地址空间对应不同的hva,这要进行区分)

所以qemu的内存模型实现如qemu的memory.txt文档所说(内存模型文档)

下面再从数据结构方面来描述一下qemu的内存建模

主要涉及到的数据结构有AddressSpace,MemoryRegion,RAMBlock。

AddressSpace代表地址空间,在x86的模拟器上主要有两种内存地址空间:

  • system_memory代表内存地址空间
  • system_io 代表io地址空间

MemoryRegion 表示一段内存,或者一个纯容器
当代表内存的时候这段内存一般是同一类型的内存,如mmio类型,rom类型,ram类型(基本上有同一类型的读写处理方式)。
另外MemoryRegion是一个输状结构,树根对应一个AddressSpace, 将这棵树展开就是AddressSpace上的一部分地址空间, 所以展开这棵树的过程要处理内存重合的逻辑。
更多MemoryRegion的说明参考(内存模型文档)

RAMBlock: 表示一段拥有hva的地址空间,一个RAMBlock对应一个非纯容器的MemoryRegion, 这样AddressSpace, MemoryRegion, RAMBlock 就建立起了gpa->hva的关系。

其实具体的实现比这还是远远复杂的(想象一下分页机制,给定一个页面如何快速找到对应的hva, io地址空间的碎片性,以及又要满足tgc和kvm)

qemu内存模型(2) 实现说明相关推荐

  1. qemu内存模型(3) 内存布局初始化

    以i386为例 static void memory_map_init(void) {system_memory = g_malloc(sizeof(*system_memory));memory_r ...

  2. java中实现具有传递性吗_Java中volatile关键字详解,jvm内存模型,原子性、可见性、有序性...

    一.Java内存模型 想要理解volatile为什么能确保可见性,就要先理解Java中的内存模型是什么样的. Java内存模型规定了所有的变量都存储在主内存中.每条线程中还有自己的工作内存,线程的工作 ...

  3. 从底层吃透java内存模型(JMM)、volatile、CAS

    前言 随着计算机的飞速发展,cpu从单核到四核,八核.在2020年中国网民数预计将达到11亿人.这些数据都意味着,作为一名java程序员,必须要掌握多线程开发,谈及多线程,绕不开的是对JMM(Java ...

  4. 循序渐进:带你理解什么是Java内存模型

    近期笔者在阅读<深入理解Java虚拟机:JVM高级特性与最佳实现(第3版)>,书中提到关于Java内存模型的知识点,但是看完之后还是感觉有些模糊,便查阅一些其他相关资料.本文是笔者经过对知 ...

  5. 深入理解C语言-二级指针三种内存模型

    二级指针相对于一级指针,显得更难,难在于指针和数组的混合,定义不同类型的二级指针,在使用的时候有着很大的区别 第一种内存模型char *arr[] 若有如下定义 char *arr[] = {&quo ...

  6. java并发编程实战:第十六章----Java内存模型

    一.什么是内存模型,为什么要使用它 如果缺少同步,那么将会有许多因素使得线程无法立即甚至永远看到一个线程的操作结果 编译器把变量保存在本地寄存器而不是内存中 编译器中生成的指令顺序,可以与源代码中的顺 ...

  7. JSR 133 Java内存模型以及并发编程的最权威论文汇总

    Java内存模型 先看官方文档: https://docs.oracle.com/javase/specs/ JSR 133:Java TM内存模型和线程规范修订版:https://www.jcp.o ...

  8. java线程的优先级是数字越大优先级越高_《深入理解Java虚拟机》5分钟速成:12章(Java内存模型与线程)...

    第12章 Java内存模型与线程 前言: 1.物理机如何处理并发问题? 2.什么是Java内存模型? 3.原子性.可见性.有序性的具体含义和应用实现? 4.volatile 关键字特性? 5.基于vo ...

  9. Java内存模型与线程

    一.一致性 高速缓存的存储交互很好的解决了处理器与内存的速度矛盾,但也存在缓存一致性(cache coherence)问题 二.java内存模型 内存模型:对特定的内存或高速缓存进行读写访问的过程抽象 ...

最新文章

  1. 论文盘点:基于图卷积GNN的多目标跟踪算法解析
  2. mybatis 二级缓存使用注意
  3. linux 深入检测io详情的工具iopp
  4. windows下批量换程序——运维常用
  5. VC++的链接错误LNK2001zz
  6. 用C语言打印1到100的罗马数字
  7. 《编程人生》中15业界传奇人物介绍
  8. 在oracle包体中动态创建表 PKG
  9. Android Q设备唯一标识符(Device ID)获取
  10. Unity 视频编码器问题解决方案(视频卡顿,花屏,黑屏)
  11. iphone修改app名称_如何更改iPhone App名称100%!
  12. JMeter录制不到接口(踩坑记录)
  13. css3.0 是什么,css3.0
  14. 联想微型计算机b540,联想B540一体机升级CPU 加内存
  15. STM32学习记录0002-STM32初探
  16. Matlab数字图像处理——图像文件的读取
  17. 小程序空格解决文字分散对齐
  18. 双活数据中心架构优缺点分析
  19. 【学习笔记】C++语言程序设计(郑莉):多态性
  20. unity跨场景保存(跨场景BGM的连续播放)

热门文章

  1. a8处理器相当于骁龙几_天玑720属于骁龙多少 天玑720处理器相当于骁龙几
  2. python3 cookie_Python3标准库:http.cookies HTTP cookie
  3. 面对对象之差异化的网络数据交互方式--单机游戏开发之无缝切换到C/S模式
  4. 超全!全国近90所大学考研报录比汇总!
  5. Ubuntu下使用OpenCV显示中文
  6. 如何策划设计作品 设计的本质 所谓设计
  7. CNUOJ 2020 LJX的高精度
  8. 用Rdkit把化学结构式的Smiles转换为InchI
  9. 表白神器——Python画丘比特之箭穿心
  10. maven项目pom.xml文件Maven install时报错