QOM दृष्टिकोण का उपयोग कर qemu
में एक नया डिवाइस अनुकरण/जोड़ने के लिए चरणबद्ध दृष्टिकोण क्या हो सकता है?QEMU स्रोत कोड में कोई नया डिवाइस कैसे जोड़ें?
डिवाइसस्टेट/बसस्टेट और अन्य गुणों के संबंध में परिवर्तन कहां और कहाँ हो सकते हैं?
QOM दृष्टिकोण का उपयोग कर qemu
में एक नया डिवाइस अनुकरण/जोड़ने के लिए चरणबद्ध दृष्टिकोण क्या हो सकता है?QEMU स्रोत कोड में कोई नया डिवाइस कैसे जोड़ें?
डिवाइसस्टेट/बसस्टेट और अन्य गुणों के संबंध में परिवर्तन कहां और कहाँ हो सकते हैं?
वहाँ 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
इंस्टेंस प्रारंभ करने के लिए ज़िम्मेदार होगा।
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 उदाहरण है:
-M versatilepb
में डिवाइस डालें: https://github.com/cirosantilli/qemu/blob/144ea94d710c666babd06ed733007377e132ed4a/hw/arm/versatilepb.c#L302sysbus_create_simple
का उपयोग करता है, जो TYPE_SYS_BUS_DEVICE
प्रकार के डिवाइस की अपेक्षा करता है।versatilepb.c
compatible
में पैरामीटर कर्नेल मॉड्यूल में platform_driver.name
से मेल खाता है से मेल खाता है, और कर्नेल जो मॉड्यूल को सूचित इस डिवाइस को संभाल लेंगे।-dtb
डीटीसी संशोधन के साथ लिनक्स कांटा Buildroot आवरण रेपो के एक submodule है साथ QEMU के फर्मवेयर को पारित कर दिया, तो बस क्लोन और ./run -a arm
।
बाहर का पेड़ उपकरणों
मैं पूछा कि क्या यह कम से बाहर के पेड़ उपकरणों बनाने के लिए संभव है: How to create out-of-tree QEMU devices? लेकिन यह यह की तरह नहीं दिखता।
सैन, किस तरह का डिवाइस? – osgx