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;
};
ㅇ 필드 설명
ㅇ 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 함수를 호출하여 초기화를 수행한다.