2015-02-04 8 views
7

QOM दृष्टिकोण का उपयोग कर qemu में एक नया डिवाइस अनुकरण/जोड़ने के लिए चरणबद्ध दृष्टिकोण क्या हो सकता है?QEMU स्रोत कोड में कोई नया डिवाइस कैसे जोड़ें?

डिवाइसस्टेट/बसस्टेट और अन्य गुणों के संबंध में परिवर्तन कहां और कहाँ हो सकते हैं?

+0

सैन, किस तरह का डिवाइस? – osgx

उत्तर

4

वहाँ 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, 
}; 

बनाना पर में "Qom टीका और सर्वनाश" 2014 प्रस्तुति उदाहरण के कुछ भागों रहे हैं (तुलना वास्तविक कोड के साथ: http://code.metager.de/source/xref/qemu/backends/rng.c और एक इम्प्लायर RNG_BACKEND http://code.metager.de/source/xref/qemu/backends/rng-random.c) की ementation

इन दो पृष्ठों हो सकता है उपयोगी भी: * http://wiki.qemu.org/Features/QOM * http://wiki.qemu.org/QOMConventions

पोस्ट "आवश्यक QEMU पीसीआई एपीआई" सिरो 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) की 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 प्रकार के ऑब्जेक्ट उदाहरण का आकार। इसका आवंटन क्यूओएम द्वारा आंतरिक रूप से किया जाएगा। अनुभाग ऑब्जेक्ट इंस्टेंटेशन में ऑब्जेक्ट्स पर अधिक विस्तार से चर्चा की जाएगी।
  • .class_init कन्स्ट्रक्टर हुक। यह फ़ंक्शन टाइप ObjectClass इंस्टेंस प्रारंभ करने के लिए ज़िम्मेदार होगा।
5

edu में पेड़ शैक्षिक पीसीआई डिवाइस

यह समझना बहुत आसान और अच्छी तरह से प्रलेखित है, इसलिए मैं सुझाव है कि आप का अध्ययन यह।

यह मूल आईओ, इंटरप्ट पीढ़ी, और डीएमए के साथ एक न्यूनतम पीसीआई डिवाइस का खुलासा करता है।

मैं एक न्यूनतम लिनक्स कर्नेल मॉड्यूल + userland परीक्षण लिखा है पर इसके साथ खेलने के लिए:

मिनिमल पीसीआई डिवाइस

मैं मैंने अपने क्यूईएमयू फोर्क पर आकार की एक चौथाई तक भी एड्यू को कम किया: https://github.com/cirosantilli/qemu/blob/22e7e210d6fbe54c35a5ae32450a4419df25a13b/hw/misc/lkmc_pci_min.c कोई डीएमए नहीं।

कर्नेल ड्राइवर: https://github.com/cirosantilli/linux-kernel-module-cheat/blob/1cd55ebf53542208f7a614a856066123b93d303d/kernel_module/pci_min.c

मेरे Buildroot आवरण पहले से ही एक submodule साथ QEMU कांटा एकीकृत सिर्फ क्लोन और ./run

एआरएम मंच डिवाइस TYPE_SYS_BUS_DEVICE

SoC-भूमि, पीसीआई के बजाय सिलिकॉन में सबसे उपकरणों bakes यहाँ एक न्यूनतम runnable उदाहरण है:

डीटीसी संशोधन के साथ लिनक्स कांटा Buildroot आवरण रेपो के एक submodule है साथ QEMU के फर्मवेयर को पारित कर दिया, तो बस क्लोन और ./run -a arm

बाहर का पेड़ उपकरणों

मैं पूछा कि क्या यह कम से बाहर के पेड़ उपकरणों बनाने के लिए संभव है: How to create out-of-tree QEMU devices? लेकिन यह यह की तरह नहीं दिखता।

संबंधित मुद्दे