understanding_qemu
  • Introduction
  • 设备模型
    • 设备类型注册
    • 设备类型初始化
    • 设备实例化
    • DeviceClass实例化细节
    • 面向对象的设备模型
    • 接口
    • 类型、对象和接口之间的转换
    • PCDIMM
      • PCDIMM类型
      • PCDIMM实例
      • 插入系统
      • 创建ACPI表
      • NVDIMM
  • 地址空间
    • 从初始化开始
    • MemoryRegion
    • AddressSpace Part1
    • FlatView
    • RAMBlock
    • AddressSpace Part2
    • 眼见为实
    • 添加MemoryRegion
  • APIC
    • 纯Qemu模拟
    • Qemu/kernel混合模拟
    • APICV
  • Live Migration
    • 从用法说起
    • 整体架构
    • VMStateDescription
    • 内存热迁移
    • postcopy
  • FW_CFG
    • 规范解读
    • Linux Guest
    • SeaBios
  • Machine
    • MachineType
    • PCMachine
  • CPU
    • TYPE_CPU
    • X86_CPU
  • MemoryBackend
    • MemoryBackend类层次结构
    • MemoryBackend初始化流程
Powered by GitBook
On this page
  • 初始化 -- address_space_init
  • 不止一个的地址空间
  • AddressSpace和MemoryRegion
  • 隐藏内容

Was this helpful?

  1. 地址空间

AddressSpace Part1

AddressSpace,看名字就知道很牛。其中也囊括、关联了很多数据结构。这次我们主要讲讲它和MemoryRegion之间的关系。

初始化 -- address_space_init

这个初始化函数倒是不长,不过包含了很多重要的内容,这里我们只说两个:

  • QTAILQ_INSERT_TAIL(&address_spaces, as, address_spaces_link);

  • as->root = root;

不止一个的地址空间

从上面第一条看,所有的地址空间都会链接在一个链表上。这就说明了在qemu中不止有一个地址空间,而不是我最开始想象的一个虚拟机公用一个地址空间。

在初始化函数中我们看到两个地址空间: address_space_memory, address_space_io。所以此时这个链表长成这样:

    address_space(global)
    +-------------------------------+
    |tqh_last                       |
    |tqh_first                      |
    +-+-----------------------------+
      |        
      |   address_space_memory             address_space_io
      |   (AddressSpace)                   (AddressSpace)
      |   +------------------------+       +------------------------+
      +-->|address_spaces_link     | ----->|address_spaces_link     |
          |                        |       |                        |
          +------------------------+       +------------------------+

AddressSpace和MemoryRegion

这个root参数是一个MemoryRegion类型,所以我们得到了AddressSpace和一个MemoryRegion对应。

慢着,我们刚才看到了什么?MemoryRegion可以是一颗树是不是?那实际上我们得到的是:

AddressSpace和一颗MemoryRegion树对应

做了一个简单的图示意:

    AddressSpace               
    +-------------------------+
    |name                     |
    |   (char *)              |
    |                         |
    |                         |          MemoryRegion(system_memory/system_io)
    +-------------------------+          +------------------------+
    |root                     |          |name                    |
    |   (MemoryRegion *)      | -------->|  (const char *)        |
    +-------------------------+          +------------------------+
                                         |addr                    |
                                         |  (hwaddr)              |
                                         |size                    |
                                         |  (Int128)              |
                                         +------------------------+
                                         |subregions              |
                                         |    QTAILQ_HEAD()       |
                                         +------------------------+
                                                    |
                                                    |
                                                    |
                                                    |
                            ----+-------------------+---------------------+----
                                |                                         |
                                |                                         |
                                |                                         |

                  struct MemoryRegion                            struct MemoryRegion
                  +------------------------+                     +------------------------+
                  |name                    |                     |name                    |
                  |  (const char *)        |                     |  (const char *)        |
                  +------------------------+                     +------------------------+
                  |addr                    |                     |addr                    |
                  |  (hwaddr)              |                     |  (hwaddr)              |
                  |size                    |                     |size                    |
                  |  (Int128)              |                     |  (Int128)              |
                  +------------------------+                     +------------------------+
                  |subregions              |                     |subregions              |
                  |    QTAILQ_HEAD()       |                     |    QTAILQ_HEAD()       |
                  +------------------------+                     +------------------------+

隐藏内容

地址空间就这么简单么?再看一眼初始化函数,发现其中还有两个子函数并没有打开。其中包含的奥秘让我们接着打开。

PreviousMemoryRegionNextFlatView

Last updated 6 years ago

Was this helpful?