Có một số bộ phận của ví dụ trong "Qom khoa chú giải và ngày tận thế" năm 2014 trình bày tại http://events.linuxfoundation.org/sites/events/files/slides/kvmforum14-qom_0.pdf
Tạo một đối tượng
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);
tính Bên
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,
};
(so sánh với mã thực tế: http://code.metager.de/source/xref/qemu/backends/rng.c và một hàm ementation của RNG_BACKEND http://code.metager.de/source/xref/qemu/backends/rng-random.c)
Hai trang có thể hữu ích quá: * http://wiki.qemu.org/Features/QOM * http://wiki.qemu.org/QOMConventions
Các bài "Essential QEMU PCI API" bởi Siro Mugabi: 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) có ví dụ hoàn chỉnh của Qom-enabled Trình điều khiển PCI.
Mô hình đối tượng QEMU (QOM) cung cấp khuôn khổ để đăng ký loại người dùng có thể tạo. QOM mô hình xe buýt, giao diện, thiết bị, vv như các loại. Trong QOM, thông tin của người dùng Type được sử dụng để tạo ra cá thể ObjectClass
cũng như đối tượng Object của nó. Thông tin này được chỉ định trong cấu trúc TypeInfo
(include/qom/object.h
). Ví dụ:
/* 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,
};
nơi:
.name
một chuỗi cho biết Type dùng.
.parent
một chuỗi chỉ định Loại mà từ đó Kiểu người dùng này bắt nguồn từ đó.
.instance_size
kích thước của đối tượng Kiểu của đối tượng. Việc phân bổ sẽ được QOM thực hiện nội bộ. Các đối tượng sẽ được thảo luận chi tiết hơn trong phần Object Object Instantiation.
.class_init
móc xây dựng. Chức năng này sẽ chịu trách nhiệm khởi tạo phiên bản ObjectClass
của Type.
San, loại thiết bị nào? – osgx