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

Was this helpful?

  1. MemoryBackend

MemoryBackend初始化流程

在上一小节的类层次结构中我们可以看到,MemoryBackend类没有继承自TYPE_DEVICE,而是有一个接口类UserCreatableClass。所以这个对象的初始化流程和其他的类型又略有不同。

这里列举在命令行中添加MemoryBackend的情况,这一切都从main函数开始。

  qemu_opts_foreach(qemu_find_opts("object"),
                    user_creatable_add_opts_foreach,
                    object_create_delayed, &error_fatal);
      user_creatable_add_opts
          user_creatable_add_type(type, id, pdict, v, errp);
              object_new("memory-backend-file")
                  host_memory_backend_init
              object_property_set(obj, v, e->key, &local_err);
              user_creatable_complete(USER_CREATABLE(obj), &local_err);
                  ucc->complete()   host_memory_backend_memory_complete
                      bc->alloc()   [ram|file|memfd]_backend_memory_alloc

可以看出,在main函数中对每一个object命令行参数都会执行上述操作。查询到指定的类型后就会执行user_creatable_add_type。

并且其中特殊的是因为这是一个UserCreatableClass类型,还会调用user_creatable_complete做进一步的操作。

而其中的ucc->complete和bc->alloc就是MemoryBackend类型需要做的特殊操作了。

好了,我觉得已经讲得够多了。具体的细节大家可以在代码中找到。我只再多说一点,对于每个MemoryBackend都会有一个RAMBlock产生~

PreviousMemoryBackend类层次结构

Last updated 5 years ago

Was this helpful?