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

问题描述 投票:0回答:2

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

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
2个回答
2
投票

文档不清楚或缺少关于“应该”如何完成的信息,但我确实找到了一个临时有效的解决方案。 在存储源文件的目录(此处为 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)



0
投票

    使用 Meson 将新设备添加到构建系统:
  1. 导航到设备源文件所在的目录(例如,
      hw/misc/foo.c
    • )。
      
      
  2. 编辑该目录中的
  3. meson.build

    文件以包含新的源文件。

    # In hw/misc/meson.build
    
    # Add your new device source file
    softmmu_ss.add(when: 'CONFIG_FOO', if_true: files('foo.c'))
    

  4. 将您的设备添加到 Kconfig 系统:
    • 导航到您的设备类型的 Kconfig 文件所在的目录(例如,
    • hw/misc/Kconfig

      )。

      
      

    • 编辑
    • Kconfig

      文件为您的新设备添加条目。

      
      

  5. # In hw/misc/Kconfig config FOO bool
在任何另一台机器上选择新的设备模块
  1. # In hw/XXX/Kconfig config <machine> select FOO
为了更好地理解上下文,我们假设我们想要将新设备模块添加到 Raspberry Pi 作为示例。在这种情况下,我们需要修改 Raspberry Pi 的 Kconfig 配置,如下所示:

# In hw/arm/Kconfig config RASPI bool select FRAMEBUFFER select PL011 select SDHCI select USB_DWC2 **select FOO** -> New device added!

我们还需要修改 Raspberry Pi 的 meson.build 配置,如下所示:

```meson # In hw/arm/meson.build arm_ss.add(when: 'CONFIG_RASPI', if_true: files('bcm2835_peripherals.c', 'bcm2836.c', 'raspi.c', **'foo.c'**)) -> foo.c added! ```

	
最新问题
© www.soinside.com 2019 - 2025. All rights reserved.