QEMU网络虚拟化(三):面向对象的模型QOM

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

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 (
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值