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产生~

Last updated