【问题标题】:How do I make my device available to QEMU如何让我的设备对 QEMU 可用
【发布时间】:2019-11-04 13:15:31
【问题描述】:

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

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)

【问题讨论】:

    标签: c device qemu


    【解决方案1】:

    文档不清楚或缺少关于如何应该完成此操作,但我确实找到了在此期间有效的解决方案。

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

    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)
    

    【讨论】:

      猜你喜欢
      • 2017-10-30
      • 1970-01-01
      • 2021-03-26
      • 2013-09-01
      • 2013-10-18
      • 1970-01-01
      • 1970-01-01
      • 2018-12-30
      • 2017-01-07
      相关资源
      最近更新 更多