如何使我的设备可用于QEMU

时间:2019-06-21 16:55:32

标签: c device qemu

我写了我认为是最小的自定义设备,以测试我对QOM和QEMU的总体理解。以下是相关代码,省略了注释。不幸的是,当我启动guest虚拟机并将设备名称作为命令行参数传递时,它无法找到我的设备并退出。我正在发出:

qemu-system-x86_64 -device hello-world-device ...

如何使QEMU知道我的设备?我需要采取什么步骤才能正确构建设备?

我可以在将源放入(qemu / hw / misc)的文件夹中看到对象列表,但是找不到其他目标的定义位置以添加新设备的目标。代码:

#include "qom/object.h"
#include "hw/qdev-core.h"
#define TYPE_HELLO "hello-world-device"
#define HELLO(obj) OBJECT_CHECK(HelloState, (obj), TYPE_HELLO)

typedef struct{
    DeviceClass parent_obj;
    uint8_t member0, member1;
} HelloState;

static const TypeInfo hello_info = {
    .name = TYPE_HELLO,
    .parent = TYPE_DEVICE,
    .instance_size = sizeof(HelloState),
    .class_init = class_init,
};

static void class_init(ObjectClass *klass, void *data){
    DeviceClass *dc = DEVICE_CLASS(klass);
}

static void hello_register_types(void){
    type_register_static(&hello_info);
}

type_init(hello_register_types)

1 个答案:

答案 0 :(得分:0)

对于该应该的操作方式,文档尚不清楚或缺失,但是我确实找到了一种在此期间可行的解决方案。

在存储源文件的目录(此处为qemu / hw / misc /)中,有一个名为Makefile.objs的文件,其中包含要创建的目标文件目标的列表。每当定义配置标志CONFIG_HELLO时,添加以下行将促使主Makefile(在QEMU根目录中)创建一个目标:

common-obj-$(CONFIG_HELLO) += hello-world-device.o

要定义此自定义标志,可以将条目添加到所选的目标体系结构。在这里,我将其添加到qemu / default-configs / x86_64-softmmu.mak中x86_64的配置中:

CONFIG_HELLO=y

进行上述更改后,运行make将创建一个规则以构建自定义设备,并在构建体系结构时的适当时间运行它。这揭示了现有代码中的一个包含错误,为方便起见,此处重复进行了更正:

#include "qemu/osdeps.h"
#include "hw/hw.h"
#define TYPE_HELLO "hello-world-device"
#define HELLO(obj) OBJECT_CHECK(HelloState, (obj), TYPE_HELLO)

typedef struct{
    DeviceClass parent_obj;
    uint8_t member0, member1;
} HelloState;

static const TypeInfo hello_info = {
    .name = TYPE_HELLO,
    .parent = TYPE_DEVICE,
    .instance_size = sizeof(HelloState),
    .class_init = class_init,
};

static void class_init(ObjectClass *klass, void *data){
    DeviceClass *dc = DEVICE_CLASS(klass);
}

static void hello_register_types(void){
    type_register_static(&hello_info);
}

type_init(hello_register_types)