qemu面向对象的模型:QOM
qemu用结构体实现了一套面向对象的机制,用于实现类和对象的概念,也实现了面向对象的封装、继承、多态。大部分设备模拟代码都会基于这个qom模型。
相关数据结构:
类定义:
struct ObjectClass
{
/*< private >*/
Type type; /* typedef struct TypeImpl *Type */
GSList *interfaces;
const char *object_cast_cache[OBJECT_CLASS_CAST_CACHE];
const char *class_cast_cache[OBJECT_CLASS_CAST_CACHE];
ObjectUnparent *unparent;
GHashTable *properties;
};
对象定义:
struct Object
{
/*< private >*/
ObjectClass *class;
ObjectFree *free; /* 当引用技术为0时,清理垃圾的回调函数 */
GHashTable *properties; /* 属性的Hash表*/
uint32_t ref; /* 对象引用计数 */
Object *parent;
};
属性定义:
typedef struct ObjectProperty
{
gchar *name;
gchar *type;
gchar *description;
ObjectPropertyAccessor *get;
ObjectPropertyAccessor *set;
ObjectPropertyResolve *resolve;
ObjectPropertyRelease *release;
void *opaque;
} ObjectProperty;
每个object对象会有上述对应的属性结构,并用哈希表组织了起来。当需要增加或者删除属性时,可调用object_property_add或object_property_del函数。
定义一个类型:
struct TypeInfo
{
const char *name;
const char *parent;
size_t instance_size;
void (*instance_init)(Object *obj); /* 实例初始化 */
void (*instance_post_init)(Object *obj);
void (*instance_finalize)(Object *obj); /* 实例析构 */
bool abstract;
size_t class_size;
void (*class_init)(ObjectClass *klass, void *data); /* 类初始化 */
void (*class_base_init)(ObjectClass *klass, void *data);
void (

本文深入探讨了QEMU中的面向对象模型QOM,详细介绍了其核心数据结构如ObjectClass、Object及ObjectProperty,以及类型注册和初始化流程。通过实例说明了如何在QEMU中实现类的继承和对象的实例化。
最低0.47元/天 解锁文章
5873

被折叠的 条评论
为什么被折叠?



