(मुझे लगता है कि इस प्रश्न का एक बड़ा मौका या तो डुप्लिकेट है या अन्यथा यहां पहले ही उत्तर दिया गया है, लेकिन उत्तर की तलाश करना "स्टैक आवंटन" और संबंधित शर्तों से हस्तक्षेप के लिए कठिन धन्यवाद है।एक नया कॉल स्टैक आवंटित करना
मेरे पास एक खिलौना कंपाइलर है जो मैं एक स्क्रिप्टिंग भाषा के लिए काम कर रहा हूं। प्रगति पर होने पर एक स्क्रिप्ट के निष्पादन को रोकने में सक्षम होने के लिए और मेजबान प्रोग्राम पर लौटने में सक्षम होने के लिए, इसका अपना ढेर है: "स्टैक पॉइंटर" वैरिएबल के साथ मेमोरी का एक साधारण ब्लॉक जो सामान्य सी कोड संचालन का उपयोग करके वृद्धि करता है उस तरह की चीज के लिए और इतने पर और आगे। अभी तक दिलचस्प नहीं है।
फिलहाल मैं सी को संकलित करता हूं लेकिन मुझे मशीन कोड के साथ संकलन की जांच करने में दिलचस्पी है - जबकि द्वितीयक ढेर और पूर्वनिर्धारित नियंत्रण बिंदुओं पर मेजबान कार्यक्रम में लौटने की क्षमता रखते हुए।
तो ... मुझे लगता है कि मेरे अपने कोड के भीतर पारंपरिक स्टैक रजिस्टरों का उपयोग करने में कोई समस्या नहीं होने की संभावना है, मुझे लगता है कि रजिस्टरों के साथ क्या होता है, जब तक यह पूरा हो जाता है तब तक सबकुछ बहाल हो जाता है अगर मैं इस बिंदु पर गलत हूं तो मुझे सही करें)। लेकिन ... यदि मैं स्क्रिप्ट कोड को किसी अन्य लाइब्रेरी कोड पर कॉल करना चाहता हूं, तो यह "वर्चुअल स्टैक" का उपयोग करके प्रोग्राम छोड़ना सुरक्षित है, या यह आवश्यक है कि इसे इस उद्देश्य के लिए मूल स्टैक दिया जाए ?
this one और this one जैसे उत्तर बताते हैं कि स्टैक स्मृति का पारंपरिक ब्लॉक नहीं है, लेकिन यह पृष्ठ दोषों और क्या नहीं के साथ विशेष, सिस्टम विशिष्ट व्यवहार पर निर्भर करता है।
तो:
- इसे सुरक्षित स्मृति के कुछ अन्य क्षेत्र में ढेर संकेत ले जाने के लिए है? ढेर स्मृति "विशेष" नहीं है? मुझे लगता है कि थ्रेडिंग लाइब्रेरीज़ को ऐसा कुछ करना होगा, क्योंकि वे अधिक स्टैक बनाते हैं ...
- मानते हैं कि मेमोरी का कोई भी क्षेत्र स्टैक रजिस्टरों और निर्देशों का उपयोग करके हेरफेर करने के लिए सुरक्षित है, मुझे कोई कारण नहीं है कि यह एक समस्या क्यों होगी एक ज्ञात कॉल गहराई (यानी कोई रिकर्सन, कोई फ़ंक्शन पॉइंटर्स) के साथ किसी भी फ़ंक्शन को कॉल करें जब तक वह वर्चुअल स्टैक पर उपलब्ध न हो। सही?
- स्टैक ओवरफ़्लो स्पष्ट रूप से सामान्य कोड में एक समस्या है, लेकिन क्या इस तरह के सिस्टम में ओवरफ़्लो के लिए कोई अतिरिक्त विनाशकारी परिणाम होगा?
यह स्पष्ट रूप से वास्तव में आवश्यक नहीं है, के बाद से बस असली ढेर की ओर इशारा लौटने पूरी तरह से उपयोगी हो जाएगा, या उस बात के लिए उन्हें पहली जगह में कोस नहीं और सिर्फ कम रजिस्टरों के साथ डाल, और मैं शायद shouldn इसे बिल्कुल करने की कोशिश नहीं करें (कम से कम मेरी गहराई से बाहर होने के कारण)। लेकिन मैं अभी भी उत्सुक हूँ। जानना चाहते हैं कि इस तरह की चीजें कैसे काम करती हैं।
संपादित करें: क्षमा करें, कहना चाहिए था। मैं x86 (32-बिट अपनी मशीन के लिए), विंडोज और उबंटू पर काम कर रहा हूं। कुछ भी विदेशी नहीं है।
इन सवालों के जवाब अत्यधिक मंच-विशिष्ट होंगे। कृपया बताएं कि आप किस प्लेटफ़ॉर्म पर काम कर रहे हैं। –
क्या आप अधिक विशिष्ट हो सकते हैं जो आप करना चाहते हैं? हो सकता है कि आप अपने वर्चुअल स्टैक पॉइंटर द्वारा क्या मतलब रखते हैं और आप होस्ट प्रक्रिया में नियंत्रण कैसे वापस लेना चाहते हैं इसका एक उदाहरण प्रदान करते हैं? –
वर्चुअल स्टैक पॉइंटर केवल एक नियमित सी चर है जो कहीं भी स्मृति ब्लॉक में इंगित करता है। "मेजबान कार्यक्रम पर लौटने" का शाब्दिक अर्थ है स्क्रिप्ट फ़ंक्शन से वापस लौटना (इसलिए यदि हम रजिस्टरों के साथ गड़बड़ कर रहे हैं, तो इसका मतलब यह होगा कि उन्हें वापस लौटने से पहले उन्हें वापस सेट करना होगा)। अनिवार्य रूप से वही चीजें जो आपके पास दुभाषिया में होंगी; दुभाषिया वस्तु अपना स्वयं का अलग कार्यक्रम राज्य बनाए रखती है। – Leushenko