यह एक विस्तृत खुला प्रश्न है, यह सुनिश्चित नहीं है कि आप इसके साथ कहां जाना चाहते हैं। विकिपीडिया सामान्य प्रश्न के साथ जेनेरिक विषय को शामिल करता है। नकली या आभासी मूल कोड को मूल कोड के साथ बदल दिया जाता है। जितना अधिक कोड चलाया जाता है उतना अधिक प्रतिस्थापित किया जाता है।
मुझे लगता है कि आपको कुछ चीजें करने की ज़रूरत है, पहले यह तय करें कि क्या आप एक इम्यूलेशन या वर्चुअल मशीन जैसे वर्चुअल मशीन या वर्चुअलबॉक्स के बारे में बात कर रहे हैं। एक अनुकरण प्रोसेसर और हार्डवेयर सॉफ़्टवेयर का उपयोग करके नकल किया जाता है, इसलिए अगला निर्देश एमुलेटर द्वारा पढ़ा जाता है, ऑपोड कोड द्वारा अलग खींच लिया जाता है और आप यह निर्धारित करते हैं कि इसके साथ क्या किया जाए। मैं कुछ 6502 अनुकरण और स्थैतिक बाइनरी अनुवाद कर रहा हूं जो गतिशील पुनर्मूल्यांकन है लेकिन वास्तविक समय के बजाय पूर्व संसाधित है। तो आपका एमुलेटर एलडीए # 10 ले सकता है, तत्काल के साथ लोड कर सकता है, एमुलेटर लोड को तत्काल निर्देश देखता है, जानता है कि उसे अगले बाइट को पढ़ना है जो तुरंत एमुलेटर के पास एक रजिस्टर के लिए कोड में एक चर है उस चर में तत्काल मूल्य। निर्देश को पूरा करने से पहले एमुलेटर को झंडे को अद्यतन करने की आवश्यकता होती है, इस मामले में शून्य ध्वज स्पष्ट है कि एन ध्वज स्पष्ट है सी और वी छूटे हुए हैं।लेकिन क्या होगा अगर अगला निर्देश तुरंत लोड एक्स था? कोई बड़ा सौदा सही नहीं है? खैर, लोड एक्स ज़ेड और एन झंडे को भी संशोधित करेगा, अगली बार जब आप लोड को एक निर्देश निष्पादित करेंगे तो आप यह समझ सकते हैं कि आपको झंडे की गणना नहीं करना है क्योंकि वे नष्ट हो जाएंगे, यह अनुकरण में मृत कोड है। आप इस तरह की सोच के साथ जारी रख सकते हैं, कहें कि आप उस कोड को देखते हैं जो एक्स रजिस्टर को एक रजिस्टर में कॉपी करता है, फिर स्टैक पर एक रजिस्टर को धक्का देता है, फिर वाई रजिस्टर को एक रजिस्टर में कॉपी करता है और स्टैक पर धक्का देता है, आप उस हिस्से को बदल सकते हैं बस स्टैक पर एक्स और वाई रजिस्ट्रार को धक्का देकर। या आप 16 बिट जोड़ने के लिए एक साथ बंधे हुए कैर्री के साथ कुछ जोड़ देख सकते हैं और परिणाम को आसन्न स्मृति स्थानों में संग्रहीत कर सकते हैं। असल में संचालन की तलाश है कि प्रोसेसर अनुकरण किया जा सकता है लेकिन अनुकरण में करना आसान है। स्टेटिक द्विआधारी अनुवाद जो मैं सुझाव देता हूं कि आप गतिशील पुनर्मूल्यांकन से पहले देखते हैं, कोड को चलाने से पहले, इस विश्लेषण और अनुवाद को एक स्थिर तरीके से निष्पादित करता है। उदाहरण के लिए आप opcodes को सी में अनुवाद करने के बजाय अनुकरण करने के बजाय और जितना संभव हो उतना मृत कोड हटा सकते हैं (एक अच्छी सुविधा यह है कि सी कंपाइलर आपके लिए अधिक मृत कोड निकाल सकता है)।
एक बार अनुकरण और अनुवाद की अवधारणा को समझने के बाद आप गतिशील रूप से ऐसा करने का प्रयास कर सकते हैं, यह निश्चित रूप से तुच्छ नहीं है। मैं सुझाव देता हूं कि लक्ष्य प्रोसेसर के मशीन कोड में बाइनरी का एक स्थिर अनुवाद फिर से करने का प्रयास करें, जो एक अच्छा अभ्यास है। मैं गतिशील रन टाइम अनुकूलन का प्रयास नहीं करता जब तक कि मैं उन्हें/द्विआधारी के खिलाफ स्थिर रूप से प्रदर्शन करने में सफल नहीं हुआ।
वर्चुअलाइजेशन एक अलग कहानी है, आप एक ही प्रोसेसर पर एक ही प्रोसेसर चलाने के बारे में बात कर रहे हैं। उदाहरण के लिए x86 पर x86 पर x86। यहां सौंदर्य यह है कि गैर-पुराने x86 प्रोसेसर का उपयोग करके, आप प्रोग्राम को वर्चुअलाइज्ड किया जा सकता है और वास्तविक प्रोसेसर पर वास्तविक ऑपोड चला सकते हैं, कोई अनुकरण नहीं। आप चीजों को पकड़ने के लिए प्रोसेसर में बने जाल सेट करते हैं, इसलिए एएक्स में मूल्य लोड करना और बीएक्स जोड़ना आदि। ये सब प्रोसेसर पर वास्तविक समय पर होते हैं, जब एएक्स मेमोरी को पढ़ना या लिखना चाहता है तो यह आपके जाल तंत्र पर निर्भर करता है यदि पते भीतर हैं वर्चुअल मशीन रैम स्पेस, कोई जाल नहीं है, लेकिन आइए कहें कि प्रोग्राम वर्चुअलाइज्ड यूर्ट के पते पर लिखता है, आपके पास प्रोसेसर जाल है जो उसके बाद वीएमवेयर या जो भी डिकोड लिखता है और इसे वास्तविक सीरियल पोर्ट से बात करता है। हालांकि एक निर्देश वास्तविक समय नहीं था, इसे निष्पादित करने में काफी समय लगा। यदि आप चुनते हैं तो आप क्या कर सकते हैं उस निर्देश या निर्देशों का सेट जो वर्चुअलाइज्ड सीरियल पोर्ट को मान लिखते हैं और शायद फिर एक अलग पते पर लिख सकते हैं जो असली सीरियल पोर्ट या कुछ अन्य स्थान हो सकता है जो नहीं जा रहा है वीएम प्रबंधक को निर्देश अनुकरण करने के लिए एक गलती का कारण बनता है। या वर्चुअल मेमोरी स्पेस में कुछ कोड जोड़ें जो बिना किसी जाल के यूआर्ट को लिखता है, और उस कोड के बजाय उस यूआरएटी को नियमित रूप से लिखने के लिए शाखा है। अगली बार जब आप कोड के उस हिस्से को दबाते हैं तो यह वास्तविक समय पर चलता है।
एक और चीज जो आप कर सकते हैं उदाहरण के लिए अनुकरण करें और जब आप लोच के समान वर्चुअल इंटरमीडिएट बाइटकोड में अनुवाद करते हैं। वहां से आप इंटरमीडिएट मशीन से मूल मशीन तक अनुवाद कर सकते हैं, अंत में पूरी चीज नहीं होने पर प्रोग्राम के बड़े वर्गों को बदल सकते हैं। आपको अभी भी परिधीय और I/O से निपटना होगा।
जो मैं बात कर रहा हूं वह नहीं है। मैं कच्चे बाइट्स लेने के बारे में बात कर रहा हूं जो स्रोत कोड नहीं है I आपको संकलक लिखने की आवश्यकता है और इसे कोड में निष्क्रिय रूप से लोड करना है। मैंने इनलाइन असेंबली के साथ एक बुरा उदाहरण देखा जो मुझे लगता है कि एक साथ बैच है लेकिन यह काम नहीं करता है यह एक बुरा उदाहरण था। –