Qemu源码分析(3)—Apple的学习笔记

书呆鱼

关注

阅读 38

2023-09-16

一,前言

本次主要分析object_new也就是了解最关键的object类对象

二,源码分析

  1. 看上去就是通过TypeImpl来创建Object。

Object *object_new(const char *typename)
{
 TypeImpl *ti = type_get_by_name(typename);
 
 return object_new_with_type(ti);
}

  1. 主要调用初始化object把type中的class先赋值给objobj->class = type->class

void object_initialize_with_type(void *data, size_t size, TypeImpl *type)
{
 Object *obj = data;
 
 g_assert(type != NULL);
 type_initialize(type);
 
 g_assert_cmpint(type->instance_size, >=, sizeof(Object));
 g_assert(type->abstract == false);
 g_assert_cmpint(size, >=, type->instance_size);
 
 memset(obj, 0, type->instance_size);
 obj->class = type->class;
 object_ref(obj);
 obj->properties = g_hash_table_new_full(g_str_hash, g_str_equal,
 NULL, object_property_free);
 object_init_with_type(obj, type);
 object_post_init_with_type(obj, type);
}

  1. 接着看object_init_with_type是一个归递从父类开始调用instance_init函数

static void object_init_with_type(Object *obj, TypeImpl *ti)
{
 if (type_has_parent(ti)) {
 object_init_with_type(obj, type_get_parent(ti));
 }
 
 if (ti->instance_init) {
 ti->instance_init(obj);
 }
}
static void object_instance_init(Object *obj)
{
 object_property_add_str(obj, "type", qdev_get_type, NULL, NULL);
}

  1. 主要调用属性add函数,把ObjectProperty放入obj的GSLinst

object_property_add(obj, name, "string",
 get ? property_get_str : NULL,
 set ? property_set_str : NULL,
 property_release_str,
 prop, &local_err);

Qemu源码分析(3)—Apple的学习笔记_qemu

父类全部归递完成objectNew就算创建完成了

Qemu源码分析(3)—Apple的学习笔记_qemu_02

5. 接着调用

#define MACHINE(obj) OBJECT_CHECK(MachineState, (obj), TYPE_MACHINE)

这种我的源码宏分析(2)已经说到过了其实就是把obj的地址赋值给MachineState的第一个元素object指针

6.再后来就是属性添加了

至于属性加了有什么用,好像后面处理都是靠属性中的值来判断,但是暂时不清楚。

object_property_add_child(object_get_root(), "machine",OBJECT(current_machine), &error_abort);

分了2部分。一个object_get_root()就是创建container容器的空节点

Qemu源码分析(3)—Apple的学习笔记_qemu_03

object_property_add_child里面主要语句就是child->parent = obj;说明把容器指向父节点container

三,总结

本节主要关注的是Object的内容如何来的,主要通过object_new函数来创建也就是根据TypeImpl中的class内容来创建TypeIpml的class源码分析(2)中第一项就有描述class赋值是在type_initialize中处理的,而且ti->class->type = ti等于ObjectClass中还会引用到TypeImpl中的内容。Object的所有子类和父类属性都放在properties的哈希表中。Object的父类容器名称为container

MachineClass的第一个元素ObjectClass类的,不是指针,所以可以理解为MachineClass继承了ObjectClass。而且父类是子类的第一个元素,典型用法是MachineClass *mc = MACHINE_CLASS(oc)。MachineState的结构体设计和使用思路雷同,用了#define MACHINE(obj)宏定义。

精彩评论(0)

0 0 举报