sizeof(PITCommonClass), .class_init = pit_common_class_init, .abstract = true, };
staticconstTypeInfopit_common_type={
.name =\ .parent =\ .instance_size=sizeof(PITCommonState), .class_size =sizeof(PITCommonClass), .class_init =pit_common_class_init, .abstract =true, };
hw\\i8254.c
static const TypeInfo pit_info = { .name = \\
sizeof(PITCommonState), .class_init = pit_class_initfn, };
staticconstTypeInfopit_info={
.name =\ .parent =\ .instance_size=sizeof(PITCommonState), .class_init =pit_class_initfn, };
由于TypeInfo只是注册时临时使用,而TypeImpl是TypeInfo的超集,所以,这层关系也反应了TypeImpl的继承关系。
struct TypeImpl { const char *name; size_t class_size; size_t instance_size; void (*class_init)(ObjectClass *klass, void *data); void (*class_base_init)(ObjectClass *klass, void *data); void (*class_finalize)(ObjectClass *klass, void *data); void *class_data; void (*instance_init)(Object *obj); void (*instance_finalize)(Object *obj); bool abstract; const char
*parent; TypeImpl *parent_type; ObjectClass *class; int num_interfaces; InterfaceImpl interfaces[MAX_INTERFACES]; };
1 structTypeImpl 2 {
3 constchar*name; 4 size_tclass_size; 5 size_tinstance_size;
6 void(*class_init)(ObjectClass*klass,void*data);
7 void(*class_base_init)(ObjectClass*klass,void*data); 8 void(*class_finalize)(ObjectClass*klass,void*data); 9 void*class_data; 10 void(*instance_init)(Object*obj); 11 void(*instance_finalize)(Object*obj); 12 boolabstract; 13 constchar*parent; 14 TypeImpl*parent_type; 15 ObjectClass*class; 16 intnum_interfaces; 17 InterfaceImplinterfaces[MAX_INTERFACES]; 18 };
Figure 1 TypeImpl图解 打印查看TypeImpl属性:
(gdb) p *obj->class->type //struct TypeImpl * type
$13 = {name = 0x5555566e5e30 \instance_size = 664, class_init = 0x55555579b790 , class_base_init = 0,
class_finalize = 0, class_data = 0x0, instance_init = 0, instance_finalize = 0, abstract = false, parent = 0x5555566e5e50 \
parent_type = 0x5555566d8bd0, class = 0x555556a50e50, num_interfaces = 0, interfaces = {{typename = 0x0} }} 其主要包含如下部分:
? ?
name/parent/parent_type 表示自己的,父亲的KEY和TypeImpl指针。 class/class_size/class_init/class_base_init/class_finalize/class_data 和ObjectClass联系,组成继承关系。
?
instance_init/instance_finalize和ObjectClass有裙带关系的Object,共同完成继承体系。
?
num_interfaces/interfaces 用于管理接口。 Object和ObjectClass的关系 还是通过这条继承链来看:
\-> \-> \-> \-> \其中ObjectClass链的定义为:
struct ObjectClass { /*< private >*/ Type type; GSList *interfaces; ObjectUnparent *unparent; }; typedef struct DeviceClass { /*<
private >*/ ObjectClass parent_class; /*< public >*/ const char *fw_name; const char *desc; Property *props; int no_user; /* callbacks */ void (*reset)(DeviceState *dev); DeviceRealize realize; DeviceUnrealize unrealize; /* device state */ const struct VMStateDescription *vmsd; /* Private to qdev / bus. */ qdev_initfn init; /* TODO remove, once users are converted to realize */ qdev_event unplug; qdev_event exit; const char *bus_type; } DeviceClass; typedef struct ISADeviceClass { DeviceClass parent_class; int (*init)(ISADevice *dev); } ISADeviceClass; typedef struct PITCommonClass { ISADeviceClass parent_class; int (*init)(PITCommonState *s); void
(*set_channel_gate)(PITCommonState *s, PITChannelState *sc, int val); void (*get_channel_info)(PITCommonState *s, PITChannelState *sc, PITChannelInfo *info); void (*pre_save)(PITCommonState *s); void
(*post_load)(PITCommonState *s); } PITCommonClass;
1 structObjectClass 2 {
3 /*< private >*/ 4 Typetype;
5 GSList*interfaces;
6 ObjectUnparent*unparent; 7 };
8 typedefstructDeviceClass{ 9 /*< private >*/
1 ObjectClassparent_class; 0 /*< public >*/ 1 constchar*fw_name;
1 constchar*desc; 1 Property*props; 2 intno_user; 1 /* callbacks */
3 void(*reset)(DeviceState*dev); 1 DeviceRealizerealize; 4 DeviceUnrealizeunrealize; 1 /* device state */
5 conststructVMStateDescription*vmsd; 1 /* Private to qdev / bus. */
6 qdev_initfninit;/* TODO remove, once users are converted to 1realize */
7 qdev_eventunplug; 1 qdev_eventexit; 8 constchar*bus_type; 1}DeviceClass;
9 typedefstructISADeviceClass{ 2 DeviceClassparent_class; 0 int(*init)(ISADevice*dev); 2}ISADeviceClass;
1 typedefstructPITCommonClass{
2 ISADeviceClassparent_class; 2 int(*init)(PITCommonState*s);
2 void(*set_channel_gate)(PITCommonState*s,PITChannelState*sc3 ,intval);
2 void(*get_channel_info)(PITCommonState*s,PITChannelState*sc4 ,
2 PITChannelInfo*info);
5 void(*pre_save)(PITCommonState*s); 2 void(*post_load)(PITCommonState*s); 6 }PITCommonClass; 27 28 29 30 31 32 3