如何在 QEMU 源代码中添加新设备?
- 2024-10-23 08:47:00
- admin 原创
- 63
问题描述:
qemu
在使用 QOM 方法时,模拟/添加新设备的分步方法是什么?
关于 DeviceState/BusState 和其他属性,会发生什么变化?变化在哪里?
解决方案 1:
edu
嵌入式教育 PCI 设备
它非常容易理解并且有据可查,所以我建议你学习它。
它公开了一个最小的 PCI 设备,具有基本 IO、中断生成和 DMA。
我已经编写了一个最小的 Linux 内核模块 + 用户空间测试来使用它:
树外设备
我问过是否可以制作树外设备:如何创建树外 QEMU 设备?但看起来不像。
解决方案 2:
2014 年“QOM 释经与启示录”演示文稿中包含一些示例,网址为http://events.linuxfoundation.org/sites/events/files/slides/kvmforum14-qom_0.pdf
创建对象
Object *o = object_new(TYPE_RNG_BACKEND_RANDOM); object_property_set_str(o, "filename", "/dev/random", NULL); object_property_set_bool(o, "opened", "true", NULL); object_property_add_child(container_get("/somewhere"), "my-rng", o, NULL); object_unref(o);
内部属性
static bool rng_get_opened(Object *obj, Error **errp) { RngBackend *s = RNG_BACKEND(obj); return s->opened; } static void rng_set_opened(Object *obj, bool value, Error **errp) { RngBackend *s = RNG_BACKEND(obj); RngBackendClass *k = RNG_BACKEND_GET_CLASS(s); ... if (k->opened) { k->opened(s, errp) } } static void rng_backend_init(Object *obj) { object_property_add_bool(obj, "opened", rng_get_opened, rng_set_opened, NULL); } static const TypeInfo rng_backend_info = { .name = TYPE_RNG_BACKEND, .parent = TYPE_OBJECT, .instance_size = sizeof(RngBackend), .instance_init = rng_backend_init, .class_size = sizeof(RngBackendClass), .abstract = true, };
(与实际代码比较:http ://code.metager.de/source/xref/qemu/backends/rng.c和 RNG_BACKEND 的一个实现http://code.metager.de/source/xref/qemu/backends/rng-random.c)
这两个页面可能也很有用:* http://wiki.qemu.org/Features/QOM
Siro Mugabi 撰写的文章“Essential QEMU PCI API”:http://nairobi-embedded.org/001_qemu_pci_device_essentials.html ( http://web.archive.org/web/20151116022950/http://nairobi-embedded.org/001_qemu_pci_device_essentials.html ) 有支持 QOM 的 PCI 驱动程序的完整示例。
QEMU 对象模型 (QOM) 提供了一个用于注册用户可创建类型的框架。QOM 将总线、接口、设备等建模为类型。在 QOM 中,用户类型的信息用于创建其
ObjectClass
实例以及其对象实例。此信息在TypeInfo
结构 (include/qom/object.h
) 中指定。例如:/* hw/misc/pci-testdev.c */ static const TypeInfo pci_testdev_info = { .name = TYPE_PCI_TEST_DEV, .parent = TYPE_PCI_DEVICE, .instance_size = sizeof(PCITestDevState), .class_init = pci_testdev_class_init, };
在哪里:
.name
指示用户类型的字符串。
.parent
一个字符串,指定此用户类型源自的类型。
.instance_size
类型的对象实例的大小。其分配将由 QOM 内部执行。对象将在“对象实例化”一节中更详细地讨论。
.class_init
构造函数钩子。此函数将负责初始化类型的ObjectClass
实例。
- 2024年20款好用的项目管理软件推荐,项目管理提效的20个工具和技巧
- 2024年开源项目管理软件有哪些?推荐5款好用的项目管理工具
- 项目管理软件有哪些?推荐7款超好用的项目管理工具
- 项目管理软件哪个最好用?盘点推荐5款好用的项目管理工具
- 项目管理软件有哪些最好用?推荐6款好用的项目管理工具
- 项目管理软件有哪些,盘点推荐国内外超好用的7款项目管理工具
- 2024项目管理软件排行榜(10类常用的项目管理工具全推荐)
- 项目管理软件排行榜:2024年项目经理必备5款开源项目管理软件汇总
- 2024年常用的项目管理软件有哪些?推荐这10款国内外好用的项目管理工具
- 项目管理必备:盘点2024年13款好用的项目管理软件