2010-03-11 11 views
8

ओएस: विंडोज 7 32 बिटविंडोज असेंबली ढेर और ढेर?

तो सी ++ में एक ढेर और ढेर है। लेकिन मैं हाल ही में कुछ असेंबली सीखने शुरू कर रहा हूं और इस तरह के कुछ भी नहीं देखा है, केवल एक ढेर है, लेकिन यह सिर्फ शुद्ध स्मृति की तरह दिखता है। तो सी ++ और अन्य भाषाओं के लिए विशिष्ट ढेर और ढेर कार्यान्वयन है? या फिर भी आप असेंबली में एक ढेर और ढेर आवंटित करते हैं? निष्पादन योग्य प्रारंभ करते समय प्रक्रिया के लिए स्मृति आवंटित करने के मामले में विंडोज क्या करता है? और प्रक्रिया को कैसे पता चलता है कि स्टैक आकार कितना बड़ा होना चाहिए?

क्या जाना

संपादित करें: संभवतः किसी ने प्रदाता कैसे ढेर और ढेर स्मृति CPU/ओएस द्वारा एक प्रक्रिया के लिए नियंत्रित किया जाता है पर एक लिंक कर सकता

उत्तर

9

ढेर ज्यादातर सीपीयू (पुश/पीओपी/कॉल/आरईटी कमांड) द्वारा बनाए रखा जाता है; ढेर पूरी तरह से ओएस/रन-टाइम लाइब्रेरी सुविधा है। इसलिए असेंबली में ढेर का उपयोग प्राकृतिक है। ढेर पहुंच के लिए आप अपने असेंबली कोड (हेपअलोक/हेपफ्री, या किसी अन्य लाइब्रेरी से) से संबंधित एपीआई को कॉल करें। ढेर के विपरीत, ढेर स्मृति प्रबंधन के लिए असेंबली भाषा में कोई निम्न स्तर के प्राइमेटिव नहीं हैं।

आपको विंडोज़ पर स्टैक आकार के बारे में चिंता करने की ज़रूरत नहीं है। जैसे-जैसे आप इसका अधिक से अधिक उपयोग करते हैं, यह पारदर्शी रूप से बढ़ेगा। निम्न-स्तरीय शर्तों में, विंडोज स्टैक तल के नीचे एक गार्ड मेमोरी पेज सेट करता है (माना जाता है कि स्टैक बढ़ता है)। जब आपका ढेर गार्ड पेज तक पहुंच जाता है, तो सीपीयू में एक एक्सेस उल्लंघन अपवाद उत्पन्न होता है। विंडोज कर्नेल इसे पकड़ लेगा, स्थिति को नोटिस करेगा और ढेर बढ़ाएगा।

+0

जानकारी के लिए धन्यवाद, लेकिन यह और सवाल उठाता है xD!खिड़कियों को कैसे पता चलेगा कि कच्चे रैम में ढेर और ढेर को मानचित्रित करना है ताकि यह अन्य प्रक्रियाओं के साथ ओवरलैप या संघर्ष न करे? विशेष रूप से यदि यह आकार में गतिशील रूप से बदल रहा है? – Daniel

+0

@ डैनियल: अन्य प्रक्रियाओं को wrt, एक ओएस वर्चुअल मेमोरी का उपयोग करता है। प्रत्येक प्रक्रिया मेमोरी (वर्चुअल एड्रेस स्पेस) के अपने दृश्य को देखती है। और हां, प्रोसेसर में वर्चुअल एड्रेस को भौतिक एक में बदलने के लिए एक तंत्र है। Http://en.wikipedia.org/wiki/Virtual_memory देखें – Bahbar

11

मेरे ज्ञान के अधिकांश Windows विशिष्ट नहीं है, इसलिए मेरे साथ भालू:

ढेर और ढेर स्मृति में विभिन्न क्षेत्रों को संदर्भित करते हैं (लेकिन हम अभी भी प्रत्येक मामले में मुख्य स्मृति के बारे में बात कर रहे हैं)। यह किसी भी भाषा के लिए विशेष नहीं है। ढेर कम स्मृति पते में रहता है और ऊपर बढ़ता है; ढेर उच्च स्मृति पते में रहता है और नीचे बढ़ता है। यह उन्हें ओवरलैपिंग से रखने के लिए है (जो बहुत बुरा होगा)।

32-बिट आर्किटेक्चर पर, ईबीपी और ईएसपी रजिस्ट्रार वर्तमान स्टैक फ्रेम का ट्रैक रखते हैं। ईबीपी बेस पॉइंटर है - यह वर्तमान स्टैक फ्रेम के उच्च पते पर इंगित करता है। ईएसपी स्टैक पॉइंटर है और यह वर्तमान स्टैक फ्रेम के निम्न पते को इंगित करता है।

याद रखें कि मुक्त/आवंटित ढेर और ढेर स्मृति की अवधारणा अधिकतर आवेदन स्तर पर प्रासंगिक है। मशीन स्तर पर, सभी मेमोरी समान दिखती हैं - यह ट्रैक रखने के लिए प्रोग्रामर (या कंपाइलर) पर निर्भर करता है कि कौन से मेमोरी सेगमेंट उपयोग में हैं।

ढेर के संयोजन द्वारा प्रबंधित किया जाता है: निर्देश जो कॉल कहते हैं, और ईबीपी और ईएसपी में स्पष्ट संशोधन। ईएसपी के नीचे कुछ भी मुक्त माना जाता है; तो स्मृति मुक्त करने के लिए आप बस ईएसपी में जोड़ सकते हैं।

ढेर स्मृति आवंटन विधियों द्वारा प्रबंधित किया जाता है; दस्तावेज here पाया जा सकता है। मुझे Winows के विवरणों के बारे में निश्चित नहीं है, लेकिन आम तौर पर कुछ मेमोरी मैनेजर होंगे जिनके पास यह सुनिश्चित करने की ज़िम्मेदारी है कि एक से अधिक एप्लिकेशन को स्मृति का कोई ब्लॉक आवंटित नहीं किया गया है।

+1

अच्छी जानकारी धन्यवाद, तो इसका मतलब है ईबीपी - ईएसपी = स्टैक फ्रेम के आकार की कुल राशि? – Daniel

+1

दाएं, और जब कोई नया फ़ंक्शन कॉल किया जाता है तो ईबीपी का मूल्य स्टैक पर सहेजा जाता है, ईएसपी का मूल्य ईबीपी में स्थानांतरित हो जाता है, और नए स्टैक फ्रेम का आकार ईएसपी से घटाया जाता है। – danben

+0

+1 बहुत उपयोगी उत्तर, धन्यवाद! – kolistivra

संबंधित मुद्दे