2012-02-17 11 views
8

यह क्वेरी malloc का उपयोग कर स्मृति के आवंटन के संबंध में है।malloc एक एम्बेडेड सिस्टम में

आम तौर पर हम क्या कहते हैं malloc ढेर से स्मृति आवंटित करता है।

अब कहें कि मेरे पास एक सादा एम्बेडेड सिस्टम (कोई ऑपरेटिंग सिस्टम नहीं है), मेरे पास सामान्य प्रोग्राम लोड है जहां मैं अपने प्रोग्राम में malloc करता हूं।

इस मामले में आवंटित स्मृति कहां है?

उत्तर

8

malloc() एक ऐसा फ़ंक्शन है जिसे आमतौर पर रनटाइम-लाइब्रेरी द्वारा कार्यान्वित किया जाता है। आप सही हैं, यदि आप किसी ऑपरेटिंग सिस्टम के शीर्ष पर चल रहे हैं, तो मॉलोक कभी-कभी (लेकिन हर बार नहीं) सिस्टम-कॉल को ट्रिगर करेगा जो ओएस को आपके प्रोग्राम के एड्रेस स्पेस में कुछ मेमोरी मैप करता है।

यदि आपका प्रोग्राम ऑपरेटिंग सिस्टम के बिना चलता है, तो आप अपने प्रोग्राम को ऑपरेटिंग सिस्टम के रूप में सोच सकते हैं। आपके पास सभी पते तक पहुंच है, जिसका अर्थ है कि आप केवल एक पॉइंटर को पता असाइन कर सकते हैं, फिर उस पॉइंटर को पढ़ने/लिखने के लिए संदर्भित करें।

बेशक

आप सुनिश्चित करें कि आपके कार्यक्रम के अन्य भागों नहीं सिर्फ एक ही स्मृति का उपयोग करने के लिए है, तो आप अपने खुद के स्मृति-प्रबंधक लिखें:

यह रखने के लिए बस आप सेट-अलग कर सकते हैं पतों की एक श्रेणी जो आपके "मेमोरी-मैनेजर" स्टोर करने के लिए उपयोग करता है कि कौन सी पता-सीमाएं पहले से उपयोग में हैं (वहां संग्रहित डेटास्ट्रक्चर एक लिंक्ड सूची या अधिक जटिल के रूप में आसान हो सकते हैं)। फिर आप एक समारोह लिखेंगे और इसे कॉल करेंगे उदा। malloc() जो आपके मेमोरी-मैनेजर का कार्यात्मक हिस्सा बनाता है। यह वर्णों का पता लगाने के लिए उल्लिखित डेटास्ट्रक्चर में दिखता है, जब तक कि तर्क निर्दिष्ट करता है और उस पर एक सूचक लौटाता है।

अब, यदि आपके प्रोग्राम में प्रत्येक फ़ंक्शन यादृच्छिक रूप से कस्टम पतों में लिखने के बजाय आपके malloc() को कॉल करता है तो आपने पहला कदम किया है। आप मुफ्त() -फंक्शन लिख सकते हैं जो निर्दिष्ट डेटास्ट्रक्चर में दिए गए सूचक की तलाश करेगा, और डेटास्ट्रक्चर को अनुकूलित करेगा (बेवकूफ लिंक्ड-सूची में यह दो लिंक मर्ज करेगा)।

+1

वास्तविक प्रश्न का उत्तर नहीं दिया: गतिशील रूप से आवंटित स्मृति कहां जाती है। यह ढेर में जाता है। ढेर कहां है? यह लिंकर स्क्रिप्ट द्वारा कॉन्फ़िगर एक पता श्रेणी में है। –

+0

@fanl आपका प्रश्न लियो मेस्सी के प्रश्न से अलग है। क्या आपने -1 उत्तर दिया था? कृपया पूर्ववत करें। यदि आप अपना खुद का प्रश्न खोलते हैं तो मैं इसका जवाब देने की कोशिश करूंगा। –

5

एकमात्र असली जवाब है "जहां भी आपका कंपाइलर/लाइब्रेरी-कार्यान्वयन इसे रखता है"।

एम्बेडेड सिस्टम में मैं उपयोग करता हूं, कोई ढेर नहीं है, क्योंकि हमने एक नहीं लिखा है।

+0

+1 और जब आप अनुकूलन सक्षम करते हैं, तो संकलक स्टैक चुन सकता है जब यह निर्धारित कर सकता है कि आवंटन स्थानीय है (उदा। फ़ंक्शन पर)। – justin

+0

ठीक है, सच है, लेकिन बहुत उपयोगी नहीं है। –

4

ढेर से आप कहते हैं। अंतर यह है कि ढेर ओएस द्वारा प्रदान नहीं किया जाता है। आपके आवेदन की लिंकर स्क्रिप्ट में कोई संदेह नहीं होगा कि ढेर के लिए आवंटन शामिल है। रन-टाइम लाइब्रेरी इसका प्रबंधन करेगी।

Newlib सी पुस्तकालय अक्सर जीसीसी आधारित एम्बेडेड सिस्टम में उपयोग किया जाता है जो ओएस नहीं चला रहा है या कम से कम लिनक्स नहीं चला रहा है, पुस्तकालय में syscall फ़ंक्शन है जिसे sbrk() कहा जाता है। यह sbrk() को लागू करने के लिए डेवलपर की श्वसनशीलता है, जो अनुरोध पर ढेर प्रबंधक को अधिक स्मृति प्रदान करनी चाहिए। आम तौर पर यह केवल एक सूचक को बढ़ाता है और नए ब्लॉक की शुरुआत में एक सूचक देता है, उसके बाद लाइब्रेरी के ढेर प्रबंधक नए ब्लॉक का प्रबंधन और रखरखाव करता है जो पिछले ब्लॉक के साथ संगत हो सकता है या नहीं। पिछले लिंक में एक उदाहरण कार्यान्वयन शामिल है।