अनुकरण एक बहुआयामी क्षेत्र है। यहां मूल विचार और कार्यात्मक घटक हैं। मैं इसे टुकड़ों में तोड़ने जा रहा हूं और फिर संपादन के माध्यम से विवरण भरूंगा। जिन चीजों का मैं वर्णन करने जा रहा हूं उनमें से कई को प्रोसेसर के आंतरिक कामकाज के ज्ञान की आवश्यकता होगी - विधानसभा ज्ञान आवश्यक है। अगर मैं कुछ चीजों पर बहुत ज्यादा अस्पष्ट हूं, तो कृपया प्रश्न पूछें ताकि मैं इस उत्तर को बेहतर बना सकूं।
मूल विचार:
उत्सर्जन प्रोसेसर और व्यक्तिगत घटकों के व्यवहार को संभालकर काम करता है। आप सिस्टम के प्रत्येक अलग-अलग टुकड़े का निर्माण करते हैं और फिर टुकड़ों को जोड़ते हैं जैसे कि तार हार्डवेयर में करते हैं।
प्रोसेसर का अनुकरण:
प्रोसेसर एमुलेशन से निपटने के तीन तरीके हैं:
- व्याख्या
- गतिशील पुनर्मिलन
- स्थैतिक पुनर्मूल्यांकन
इन सभी रास्तों के साथ, आपके पास एक ही समग्र लक्ष्य है: प्रोसेसर राज्य को संशोधित करने और 'हार्डवेयर' के साथ बातचीत करने के लिए कोड का एक टुकड़ा निष्पादित करें। प्रोसेसर राज्य किसी दिए गए प्रोसेसर लक्ष्य के लिए प्रोसेसर रजिस्टर, इंटरप्ट हैंडलर आदि का एक समूह है। 6502 के लिए, आप रजिस्टरों का प्रतिनिधित्व 8 बिट पूर्णांक के एक नंबर होगा: A
, X
, Y
, P
, और S
; आपके पास 16-बिट PC
रजिस्टर भी होगा।
व्याख्या के साथ, आप IP
(निर्देश सूचक - जिसे PC
प्रोग्राम काउंटर भी कहा जाता है ) पर शुरू करते हैं और निर्देश को स्मृति से पढ़ते हैं। आपका कोड इस निर्देश को पार्स करता है और इस जानकारी का उपयोग आपके प्रोसेसर द्वारा निर्दिष्ट प्रोसेसर स्थिति को बदलने के लिए करता है। व्याख्या के साथ मुख्य समस्या यह है कि यह बहुत धीमी है; हर बार जब आप किसी दिए गए निर्देश को संभालते हैं, तो आपको इसे डिकोड करना होगा और अपेक्षित ऑपरेशन करना होगा।
गतिशील पुनर्संयोजन के साथ, आप व्याख्या की तरह कोड पर पुनरावृति करते हैं, लेकिन सिर्फ opcodes को निष्पादित करने के बजाय, आप संचालन की एक सूची बनाते हैं। एक बार जब आप एक शाखा निर्देश पर पहुंच जाते हैं, तो आप अपने होस्ट प्लेटफॉर्म के लिए मशीन कोड के संचालन की इस सूची को संकलित करते हैं, फिर आप इस संकलित कोड को कैश करते हैं और इसे निष्पादित करते हैं। फिर जब आप किसी दिए गए निर्देश समूह को फिर से हिट करते हैं, तो आपको केवल कैश से कोड निष्पादित करना होगा। (BTW, ज्यादातर लोग वास्तव में निर्देशों की एक सूची नहीं बनाते हैं, लेकिन उन्हें मक्खी पर मशीन कोड के लिए संकलित करते हैं - इससे अनुकूलन करना अधिक कठिन हो जाता है, लेकिन यह इस जवाब के दायरे से बाहर है, जब तक कि पर्याप्त लोग रुचि न लें)
स्टेटिक रीकॉम्पिलेशन के साथ, आप वैसा ही करते हैं जैसा कि डायनैमिक रीकैपिलेशन में होता है, लेकिन आप ब्रांच को फॉलो करते हैं। आप अंत में कोड का एक हिस्सा बना रहे हैं जो कार्यक्रम में सभी कोड का प्रतिनिधित्व करता है, जिसे बाद में बिना किसी हस्तक्षेप के निष्पादित किया जा सकता है। यदि यह निम्न समस्याओं के लिए नहीं थे, तो यह एक महान तंत्र होगा:
- कोड है कि कार्यक्रम के साथ शुरू करने के लिए नहीं है (जैसे संपीड़ित, एन्क्रिप्टेड, उत्पन्न / रनटाइम पर संशोधित, आदि) को फिर से जोड़ा नहीं जाएगा, इसलिए यह नहीं चलेगा
- यह साबित हो गया है कि किसी दिए गए बाइनरी में सभी कोड ढूंढना हॉल्टिंग समस्या के बराबर है
ये 99% मामलों में स्थिर पुनर्संयोजन को पूरी तरह से संभव बनाने के लिए गठबंधन करते हैं। अधिक जानकारी के लिए, माइकल स्टिल ने स्थैतिक पुनर्मूल्यांकन में कुछ महान शोध किए हैं - मैंने जो सबसे अच्छा देखा है।
प्रोसेसर इम्यूलेशन का दूसरा पक्ष वह तरीका है जिसमें आप हार्डवेयर के साथ इंटरैक्ट करते हैं। यह वास्तव में दो पक्ष हैं:
- प्रोसेसर का समय
- बाधा से निपटने
प्रोसेसर समय:
कुछ प्लेटफार्मों - विशेष रूप से पुराने कंसोल जैसे एनईएस, एसएनईएस, आदि - आपके एमुलेटर को पूरी तरह से अनुकूल होने के लिए सख्त समय की आवश्यकता होती है। एनईएस के साथ, आपके पास पीपीयू (पिक्सेल प्रोसेसिंग यूनिट) है जिसके लिए सीपीयू को सटीक क्षणों में अपनी मेमोरी में पिक्सल डालना होगा। यदि आप व्याख्या का उपयोग करते हैं, तो आप आसानी से चक्रों की गणना कर सकते हैं और उचित समय का अनुकरण कर सकते हैं; गतिशील / स्थिर पुनर्संयोजन के साथ, चीजें एक / बहुत / अधिक जटिल हैं।
इंटरप्ट हैंडलिंग:
रुकावट प्राथमिक तंत्र है जो सीपीयू हार्डवेयर के साथ संचार करता है। आम तौर पर, आपके हार्डवेयर घटक सीपीयू को बताएंगे कि वह किस बारे में परवाह करता है। यह बहुत सीधा है - जब आपका कोड किसी दिए गए व्यवधान को फेंकता है, तो आप अंतःक्रियात्मक हैंडलर तालिका को देखते हैं और उचित कॉलबैक कहते हैं।
हार्डवेयर अनुकरण:
किसी दिए गए हार्डवेयर उपकरण का अनुकरण करने के दो पक्ष हैं:
- डिवाइस की कार्यक्षमता का अनुकरण
- वास्तविक डिवाइस इंटरफेस का अनुकरण
हार्ड-ड्राइव का मामला लें। कार्यक्षमता का समर्थन बैकिंग स्टोरेज, रीड / राइट / फॉर्मेट रूटीन आदि बनाकर किया जाता है। यह भाग आम तौर पर बहुत सीधा होता है।
डिवाइस का वास्तविक इंटरफ़ेस थोड़ा अधिक जटिल है। यह आम तौर पर मेमोरी मैप किए गए रजिस्टरों का कुछ संयोजन होता है (जैसे कि मेमोरी के कुछ हिस्से जो डिवाइस सिग्नलिंग करने के लिए बदलाव के लिए देखता है) और बीच में आता है। हार्ड-ड्राइव के लिए, आपके पास एक मेमोरी मैप्ड क्षेत्र हो सकता है, जहाँ आप रीड कमांड, राइट्स वगैरह रखते हैं, फिर इस डेटा को वापस पढ़ें।
मैं और अधिक विस्तार में जाऊँगा, लेकिन एक लाख तरीके हैं जिससे आप इसके साथ जा सकते हैं। यदि आपके यहाँ कोई विशिष्ट प्रश्न हैं, तो बेझिझक पूछें और मैं जानकारी जोड़ दूँगा।
संसाधन:
मुझे लगता है कि मैंने यहां बहुत अच्छा परिचय दिया है, लेकिन अतिरिक्त क्षेत्रों के एक टन हैं। मैं किसी भी प्रश्न के साथ मदद करने के लिए खुश हूं; मैं इस में बहुत अस्पष्ट हो गया हूँ बस विशाल जटिलता के कारण।
अनिवार्य विकिपीडिया लिंक:
सामान्य उत्सर्जन संसाधन:
- ज़ोफ़र - यह वह जगह है जहाँ मुझे मेरी शुरुआत एमुलेशन से हुई, पहले एमुलेटर डाउनलोड करने और अंत में डॉक्यूमेंटेशन के उनके अपार संग्रह को लूटा गया। यह संभवतः सबसे अच्छा संसाधन है जो संभवतः आपके पास हो सकता है।
- NGEmu - कई प्रत्यक्ष संसाधन नहीं हैं, लेकिन उनके फ़ोरम अपराजेय हैं।
- RomHacking.net - दस्तावेज़ अनुभाग में लोकप्रिय कंसोल के लिए मशीन वास्तुकला से संबंधित संसाधन हैं
संदर्भ के लिए एमुलेटर परियोजनाएं:
- आयरनबेल - यह .NET के लिए एक एमुलेशन प्लेटफॉर्म है, जो नेमेर्ले में लिखा गया है और उड़ने पर C # पर recompiles कोड है। अस्वीकरण: यह मेरी परियोजना है, इसलिए बेशर्म प्लग को क्षमा करें।
- BSnes - चक्र-सही सटीकता के लक्ष्य के साथ एक भयानक SNES एमुलेटर।
- MAME - आर्केड एमुलेटर। महान संदर्भ।
- 6502asm.com - यह एक जावास्क्रिप्ट 6502 एमुलेटर है जिसमें एक छोटा सा मंच है।
- dynarec'd 6502asm - यह एक छोटी हैक है जिसे मैंने एक या दो दिन में किया था। मैंने मौजूदा एमुलेटर को 6502asm.com से लिया और इसे बड़े पैमाने पर गति बढ़ाने के लिए कोड को जावास्क्रिप्ट में बदलकर गतिशील रूप से फिर से जोड़ दिया।
प्रोसेसर का संदर्भ
- माइकल Steil (ऊपर संदर्भित) के द्वारा किया स्थिर रखता में अनुसंधान में समापन हुआ इस पत्र और आप स्रोत है और इस तरह पा सकते हैं यहाँ ।
परिशिष्ट:
यह उत्तर प्रस्तुत किए जाने के बाद से एक साल से अधिक समय हो गया है और सभी ध्यान से यह हो रहा है, मुझे लगा कि यह कुछ चीजों को अपडेट करने का समय है।
शायद अनुकरण में सबसे रोमांचक बात अभी है एम्युलेशन libcpu , जिसे उपरोक्त माइकल स्टिल ने शुरू किया था। यह एक बड़ी संख्या में सीपीयू कोर का समर्थन करने के लिए एक पुस्तकालय है, जो पुनर्संयोजन (स्थिर और गतिशील) के लिए एलएलवीएम का उपयोग करता है। यह बहुत बड़ी संभावना है, और मुझे लगता है कि यह अनुकरण के लिए बहुत अच्छे काम करेगा।
एमु-डॉक्स को भी मेरे ध्यान में लाया गया है, जो सिस्टम प्रलेखन का एक बड़ा भंडार है, जो अनुकरण के उद्देश्यों के लिए बहुत उपयोगी है। मैंने वहां ज्यादा समय नहीं बिताया है, लेकिन ऐसा लगता है कि उनके पास बहुत सारे संसाधन हैं।
मुझे खुशी है कि यह पोस्ट मददगार रही है, और मुझे उम्मीद है कि मैं अपनी गांड को हटा सकता हूं और अगले साल के अंत तक इस विषय पर अपनी पुस्तक समाप्त कर सकता हूं।