R&D/Hypervisor

[QEMU] TypeInfo

sunshout 2013. 12. 17. 08:47

QEMU에서는 리소스를 모듈처럼 로드해서 사용한다.


ㅇ TypeInfo 구조체 정의


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 (*class_finalize)(ObjectClass *klass, void *data);

    void *class_data;

    InterfaceInfo *interfaces;

};



ㅇ 필드 설명

struct TypeInfo 선언
name: type의 이름
parent: parent type의 이름
instance_size: objectsize
instance_init: initilize 할 때 호출하는 함수
instance_post_init: initilization을 마치고 호출하는 함수
instance_finalize: object destruction시 호출하는 함수
abstract: true면 해당 classabstract class(intialization을 하지 말 것)
class_size: class objectsize
class_init: 모든 parent classinitialization을 마치고 호출되는 함수
class_base_init: parent classinitialization되고 나서 , base class를 위해서 호출되는 함수
class_finalize: class destruction시 호출되는 함수
class_data: @class_init, @class_base_init, @class_finalize 시 전달되는 data

interfaces: this type과 연계된 interfaceslist



ㅇ TypeInfo 생성 예)

 - 특정 리소스(e1000 driver)를 생성하기 위해서는 1) TypeInfo 구조체 정의, 2) Type 등록, 3) 모듈 로드 의 3단계가 필요하다.

 

/* Type struct 정의 */

static const TypeInfo e1000_info = {

  .name             = TYPE_E1000,

  .parent            = TYPE_PCI_DEVICE,

  .instance_size  = sizeof(E1000State),

  .class_init        = e1000_class_init,

};

/* register type */

static void e1000_register_types(void)

{

     type_register_static(&e1000_info);

}

/* module load */

type_init(e1000_register_types)




type_init 함수는 __attribute__((constructor) 의 매크로로 main함수가 실행되기 전에 로드되는 함수이며, 파라메터로 넘겨 준 함수는 Module->init 함수로 등록된다.


TypeInfo 구조체는 GHashTable *type_table에 key=type->name, value=type instance 로 등록된다.

. 나중에 device를 initialize 할 때 type_table_lookup을 통해서 TypeInfo instance를 불러 옴

 

main함수의  module_call_init(MODULE_INIT_QOM)  함수 실행시, constructor에 의해서 생성된 모든 모듈의 init 함수를 호출하여 초기화를 수행한다.