ci sono alcune parti di esempio in "QOM esegesi e apocalisse" 2014 presentazione a http://events.linuxfoundation.org/sites/events/files/slides/kvmforum14-qom_0.pdf
Creazione di un oggetto
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);
proprietà All'interno
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,
};
(confrontare con codice effettivo: http://code.metager.de/source/xref/qemu/backends/rng.c e un impl ementation di RNG_BACKEND http://code.metager.de/source/xref/qemu/backends/rng-random.c)
Queste due pagine può essere utile anche: * http://wiki.qemu.org/Features/QOM * http://wiki.qemu.org/QOMConventions
Il post "Essential QEMU PCI API" di 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) presenta esempio completo di Qom abilitati Driver PCI.
QEMU Object Model (QOM) fornisce un framework per la registrazione di tipi creabili dall'utente. QOM modella bus, interfacce, dispositivi, ecc. Come tipi. In QOM, le informazioni di un utente Type vengono utilizzate per creare l'istanza ObjectClass
e l'istanza Object. Questa informazione è specificata in una struttura TypeInfo
(include/qom/object.h
). Ad esempio:
/* 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,
};
dove:
.name
una stringa che indica il tipo di utente.
.parent
una stringa che specifica il tipo da cui deriva questo tipo di utente.
.instance_size
dimensioni dell'istanza dell'oggetto del tipo. La sua allocazione verrà eseguita internamente da QOM. Gli oggetti saranno discussi più dettagliatamente nella sezione Oggetto Instantiation.
.class_init
il gancio del costruttore. Questa funzione sarà responsabile per l'inizializzazione dell'istanza ObjectClass
del Type.
San, che tipo di dispositivo? – osgx