C 如何使我的设备可供QEMU使用

C 如何使我的设备可供QEMU使用,c,device,qemu,C,Device,Qemu,我已经写了一个我认为是最小的定制设备来测试我对QOM和QEMU的总体理解。以下是省略注释的相关代码。不幸的是,当我启动来宾并将我的设备名作为命令行参数传递时,它无法找到我的设备并退出。我发布: qemu-system-x86\u 64-设备hello world设备… 如何让QEMU知道我的设备?我需要采取哪些步骤来正确构建我的设备 我可以在我将源代码放入的文件夹(qemu/hw/misc)中看到一个对象列表,但我找不到其他目标的定义位置,以便为我的新设备添加目标。守则: #include "q

我已经写了一个我认为是最小的定制设备来测试我对QOM和QEMU的总体理解。以下是省略注释的相关代码。不幸的是,当我启动来宾并将我的设备名作为命令行参数传递时,它无法找到我的设备并退出。我发布:

qemu-system-x86\u 64-设备hello world设备…

如何让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)

文档中不清楚或缺少关于如何实现这一点的信息,但我确实找到了一个在过渡期间有效的解决方案

在存储源文件的目录中(这里是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 bug,为了方便起见,这里重复了以下更正:

#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)