केमू :
QEmu एक पूर्ण और स्वसंपूर्ण सॉफ्टवेयर है। आप इसका उपयोग मशीनों का अनुकरण करने के लिए करते हैं, यह बहुत लचीला और पोर्टेबल है। मुख्य रूप से यह एक विशेष 'recompiler' द्वारा काम करता है जो किसी दिए गए प्रोसेसर के लिए लिखे गए बाइनरी कोड को दूसरे में बदल देता है (जैसे, PPC मैक पर MIPS कोड चलाने के लिए, या x86 PC में ARM)।
केवल प्रोसेसर से अधिक का अनुकरण करने के लिए, क्यूमू में परिधीय एमुलेटर की एक लंबी सूची शामिल है: डिस्क, नेटवर्क, वीजीए, पीसीआई, यूएसबी, सीरियल / समानांतर पोर्ट, आदि।
KQemu :
विशिष्ट मामले में जहां स्रोत और लक्ष्य दोनों समान वास्तुकला हैं (x86 पर x86 के सामान्य मामले की तरह), फिर भी किसी भी 'विशेषाधिकार प्राप्त निर्देशों' को हटाने और उन्हें संदर्भ स्विच के साथ बदलने के लिए कोड को पार्स करना होगा। X86 लिनक्स पर इसे यथासंभव कुशल बनाने के लिए, KQemu नामक एक कर्नेल मॉड्यूल है जो इसे संभालता है।
कर्नेल मॉड्यूल होने के नाते, KQemu अधिकांश कोड अपरिवर्तित करने में सक्षम है, केवल न्यूनतम स्तर के रिंग0-केवल निर्देशों की जगह। उस स्थिति में, उपयोगकर्ता स्थान Qemu अभी भी उत्सर्जित मशीन के लिए सभी RAM आवंटित करता है, और कोड लोड करता है। अंतर यह है कि कोड को पुनः स्थापित करने के बजाय, यह KQemu को स्कैन / पैच / निष्पादित करने के लिए कहता है। सभी परिधीय हार्डवेयर अनुकरण Qemu में किया जाता है।
यह सादे Qemu की तुलना में बहुत तेज़ है क्योंकि अधिकांश कोड अपरिवर्तित है, लेकिन फिर भी रिंग0 कोड (वीएम के कर्नेल में अधिकांश कोड) को बदलना है, इसलिए प्रदर्शन अभी भी ग्रस्त है।
KVM :
KVM चीजों की एक जोड़ी है: पहले यह एक लिनक्स कर्नेल मॉड्यूल है - अब मेनलाइन में शामिल है - जो प्रोसेसर को एक नए 'अतिथि' स्थिति में बदल देता है। अतिथि राज्य के पास रिंग राज्यों का अपना सेट है, लेकिन विशेषाधिकार प्राप्त ring0 निर्देश हाइपरवाइजर कोड पर वापस आते हैं। चूंकि यह निष्पादन का एक नया प्रोसेसर मोड है, इसलिए कोड को किसी भी तरह से संशोधित करने की आवश्यकता नहीं है।
प्रोसेसर स्थिति स्विचिंग के अलावा, कर्नेल मॉड्यूल एमएमयू रजिस्टरों (वीएम को संभालने के लिए इस्तेमाल किया जाता है) और पीसीआई के कुछ हिस्सों जैसे इम्यूलेशन हार्डवेयर के कुछ कम-स्तरीय भागों को भी संभालता है।
दूसरा, KVM Qemu निष्पादन योग्य का एक कांटा है। दोनों टीमें कम से कम अंतर रखने के लिए सक्रिय रूप से काम करती हैं, और इसे कम करने में प्रगति होती हैं। आखिरकार, लक्ष्य यह है कि क्यूमू कहीं भी काम करे, और यदि केवीएम कर्नेल मॉड्यूल उपलब्ध है, तो यह स्वचालित रूप से उपयोग किया जा सकता है। लेकिन निकट भविष्य के लिए, Qemu टीम हार्डवेयर इम्यूलेशन और पोर्टेबिलिटी पर ध्यान केंद्रित करती है, जबकि KVM लोग कर्नेल मॉड्यूल (कभी-कभी इम्प्लिमेंट के छोटे हिस्सों को आगे बढ़ाते हैं, अगर यह प्रदर्शन में सुधार करता है) पर ध्यान केंद्रित करता है, और बाकी यूजरस्पेस कोड के साथ इंटरफेस होता है।
Kvm-qemu निष्पादन योग्य कार्य सामान्य Qemu की तरह काम करता है: RAM को आवंटित करता है, कोड को लोड करता है, और इसे recompiling करने या KQemu को कॉल करने के बजाय, यह एक थ्रेड spawns (यह महत्वपूर्ण है)। थ्रेड अतिथि मोड में स्विच करने के लिए KVM कर्नेल मॉड्यूल को कॉल करता है और VM कोड को निष्पादित करने के लिए आगे बढ़ता है। एक विशेषाधिकार प्राप्त निर्देश पर, यह केवीएम कर्नेल मॉड्यूल पर वापस स्विच करता है, जो कि यदि आवश्यक हो, तो अधिकांश हार्डवेयर अनुकरण को संभालने के लिए क्यूमू थ्रेड को इंगित करता है।
इस वास्तुकला की एक अच्छी बात यह है कि अतिथि कोड एक पॉज़िक्स थ्रेड में अनुकरण किया गया है जिसे आप सामान्य लिनक्स टूल के साथ प्रबंधित कर सकते हैं। यदि आप 2 या 4 कोर के साथ एक वीएम चाहते हैं, तो kvm-qemu 2 या 4 थ्रेड बनाता है, उनमें से प्रत्येक KVM कर्नेल मॉड्यूल को निष्पादित करना शुरू करने के लिए कहता है। यदि आपके पास पर्याप्त वास्तविक कोर हैं या संगोष्ठी - यदि सामान्य लिनक्स अनुसूचक द्वारा प्रबंधित नहीं की जाती है, तो कोड को छोटा और आश्चर्य सीमित रखना है।