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