क्या किसी सिस्टम पर सभी खाली जगह को आवंटित करके दूसरे प्रोग्राम से मेमोरी पढ़ना संभव है?


26

सैद्धांतिक रूप से, अगर मैं एक ऐसे प्रोग्राम का निर्माण करने वाला था, जो एक सिस्टम पर सभी अप्रयुक्त मेमोरी को आवंटित करता है, और अधिक से अधिक मेमोरी का अनुरोध करता रहा, क्योंकि अन्य अनुप्रयोगों ने मेमोरी को जारी किया था, जिनकी उन्हें अब आवश्यकता नहीं है, क्या यह संभव है कि किसी अन्य एप्लिकेशन से हाल ही में जारी की गई मेमोरी को पढ़ें। ? या यह किसी भी तरह आधुनिक ऑपरेटिंग सिस्टम द्वारा संरक्षित है?

मेरे पास इसके लिए कोई व्यावहारिक अनुप्रयोग नहीं है, मैं बस उत्सुक हूं। मुझे एहसास है कि वास्तविक जीवन में "सभी उपलब्ध स्मृति" को आवंटित करने के साथ कुछ मुद्दे हैं।

संपादित करें: स्पष्ट करने के लिए, मैं विशेष रूप से "जारी" मेमोरी के बारे में पूछ रहा हूं, उस मेमोरी तक पहुंच नहीं है जो वर्तमान में किसी अन्य एप्लिकेशन द्वारा आवंटित की गई है।

जवाबों:


23

नहीं, क्योंकि एक अच्छा कर्नेल स्मृति की सामग्री को पोंछता है, क्योंकि यह प्रक्रिया के लिए जारी करने से पहले आप जिस तरह के हमले का प्रस्ताव करते हैं, उसके खिलाफ सुरक्षा के लिए जारी किया जाता है।

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

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

malloc()मेमोरी को इनिशियलाइज़ न करने के लिए कोई सुरक्षा निहितार्थ नहीं हैं क्योंकि इसके माध्यम brk()से प्राप्त की गई किसी भी चीज़ को स्क्रब किया जाएगा और पहले वाली free()d को उसी प्रक्रिया से लिखा जाएगा।


19

हां, एक अन्य प्रक्रिया 'जारी की गई मेमोरी' को पढ़ना सैद्धांतिक रूप से संभव है। यह दिन में कई विशेषाधिकार वृद्धि हमलों का स्रोत था। उस वजह से, ऑपरेटिंग सिस्टम आजकल प्रभावी रूप से मेमोरी को शून्य कर देता है यदि इसे पहले किसी अन्य प्रक्रिया द्वारा आवंटित किया गया था। इसका कारण यह है कि आप हमेशा शून्य आउट मेमोरी को नहीं देखते हैं क्योंकि यह मेमोरी को शून्य करने के लिए अधिक कुशल नहीं है यदि इसे पहले इसी प्रक्रिया द्वारा आवंटित किया गया था। ओएस एक ही प्रक्रिया में मेमोरी पेज को वापस देने की कोशिश करता है यदि यह हो सकता है।


1
"हां लेकिन नहीं" "नहीं" है। @ बेलरफ के पास यह अधिकार है।
रॉस पैटरसन

4
@RossPatterson: सैद्धांतिक बिंदु पर, कार्ल वास्तव में मेरी तुलना में अधिक सही है। व्यावहारिक वास्तविकता यह है कि मुख्यधारा के ओएस ने वर्षों पहले उस छेद को बंद कर दिया था।
ब्लरफ्ल

@ ब्लर अंडरस्टूड। लेकिन "साल पहले" 1960 के दशक के अंत में था, जब पेजिंग सिस्टम और वर्चुअल मेमोरी पहली बार शुरू की गई थी। निश्चित रूप से मल्टीिक्स, वीएम / 370 और ओएस / वीएस के समय तक। अनुपस्थित कीड़े, यह अधिकांश अभ्यास करने वाले प्रोग्रामर की याद में संभव नहीं है।
रॉस पैटरसन

The reason you don't always see zeroed out memory is because it is more efficient not to zero out the memory if it was previously allocated by the same process मुझे यहाँ कुछ असंगति दिखाई देती है। क्या आपका मतलब "समान निष्पादन योग्य" था? यह कैसे जांचा जाता है कि क्या शून्य बाहर नहीं है - डिस्क पथ द्वारा?
जकुब.ग।

1
मुझे लगता है कि मुझे कुछ याद आ रहा है। क्यों, जब मैं कुछ C ++ प्रोग्राम को संकलित करता हूं और चलाता हूं, तो, अनइंस्टॉलिज्ड पूर्णांक, वे 0 के बराबर नहीं होते हैं जब मैं उन चर को पढ़ता हूं?
याकूब

2

यहां कई परतें शामिल हैं जो उत्तर को प्रभावित करती हैं।

यदि आप एक आधुनिक वर्चुअल मेमोरी ऑपरेटिंग सिस्टम ग्रहण करते हैं, तो आप अपने द्वारा आवंटित पृष्ठों में अन्य प्रक्रियाओं के डेटा के अवशेष नहीं देख पाएंगे।

जब कोई प्रक्रिया पहले लोड होती है, तो पृष्ठ तालिका लोड हो जाती है, और उन पृष्ठों पर वास्तविक मेमोरी के संभावित फ्रेम आवंटित किए जाते हैं। कम से कम, पृष्ठ तालिका या इसकी पूरक तालिका में, सभी मेमोरी का एक नक्शा होगा जिसमें प्रक्रिया आवंटित की जा सकती है। यह वह जगह भी है जहां प्रारंभिक प्रक्रिया टूट जाती है, ऊपर वर्णित है, सेट हो जाता है।

जबकि मॉलोक () हो सकता है, यदि प्रक्रिया की अनुमति है, तो प्रक्रिया को बदलने के लिए प्रक्रिया विराम का कारण बनें, अनुरोध को संतुष्ट करने के लिए एक प्रक्रिया पृष्ठ (पूरक पृष्ठ) तालिका में अधिक पृष्ठ जोड़ते हुए, वह स्थान जहां एक प्रक्रिया "दूसरे को प्राप्त कर सकती है" प्रक्रिया डेटा पर है निचली वास्तविक मेमोरी लेयर।

इन दोनों परिदृश्यों में एक आधुनिक ऑपरेटिंग सिस्टम जो मांग पेजिंग, या आलसी आवंटन का उपयोग करता है, वह अभी तक भौतिक मेमोरी (फ्रेम) आवंटित नहीं कर रहा है। ऑपरेटिंग सिस्टम सिर्फ "नोट्स बनाना" है जिसके बारे में उस प्रक्रिया के लिए वर्चुअल मेमोरी को वैध माना जाता है। जरूरत पड़ने पर ही वास्तविक स्मृति सौंपी जाती है।

भौतिक मेमोरी या फ़्रेम को एक प्रक्रिया के लिए आवंटित किया जाता है जब वर्चुअल पेज का एहसास होता है और प्रक्रियाओं की तालिका में मैप किया जाता है। यह वह जगह है जहां डेटा एक्सपोज़र की संभावना मौजूद है। यह पृष्ठ दोष के दौरान होता है। एक्सपोज़र इसलिए है क्योंकि पिछली प्रक्रिया उसी फ्रेम का उपयोग कर रही हो सकती है और इसके डेटा को या तो छोड़ दिया गया था या स्वैप कर दिया गया था, ताकि वर्तमान भौतिक मेमोरी अनुरोध के लिए जगह बनाई जा सके। ऑपरेटिंग सिस्टम को यह सुनिश्चित करने के लिए सावधान रहना चाहिए कि अनुरोध प्रक्रिया डेटा को ठीक से स्वैप किया गया है या प्रक्रिया को फिर से शुरू करने से पहले फ्रेम को साफ़ (शून्य) किया गया है। यह "पुरानी लेकिन हल की गई" समस्या के रूप में भी ऊपर वर्णित है।

इससे यह कुछ हद तक अप्रासंगिक हो जाता है यदि अन्य प्रक्रियाओं की मेमोरी "जारी" की गई थी या नहीं। एक और प्रक्रिया "जारी" मेमोरी अभी भी उस प्रक्रिया को सौंपे गए पृष्ठों में रहती है और आमतौर पर तब तक अनमैप नहीं होती है जब तक कि प्रक्रिया समाप्त नहीं हो जाती है क्योंकि स्मृति कम होने पर उन्हें बस बाहर निकाल दिया जाएगा या वे अन्यथा बेदखल हो जाएंगे। (उपयोगकर्ता) स्तर पर प्रक्रिया को सौंपी गई वर्चुअल मेमोरी का प्रबंधन मॉलॉक () और फ्री () करते हैं।

आपके प्रश्न में, आपकी प्रक्रिया, अधिक से अधिक स्मृति का अनुरोध करना जारी रखती है, सिद्धांत रूप में, अन्य सभी प्रक्रियाओं को स्मृति से बाहर धकेल देती है। वास्तव में, वैश्विक और स्थानीय रूप से फ्रेम आवंटन रणनीतियाँ हैं - जो उत्तर को भी प्रभावित कर सकती हैं। यह संभावना है कि यह प्रक्रिया अपने स्वयं के पृष्ठों को स्मृति से बाहर कर देगी, इससे पहले कि यह ऑपरेटिंग सिस्टम और अन्य सभी प्रक्रियाओं को समाप्त करने की अनुमति दे। हालांकि यह आपके प्रारंभिक प्रश्न से परे है।

यह सब MS-DOS जैसी प्रणाली में लूट है। MS-DOS (और अन्य, सरल सिस्टम) वर्चुअल मेमोरी (स्वयं के द्वारा) का उपयोग नहीं करते हैं और आप आसानी से एक और "प्रक्रिया" डेटा पर प्रहार और ठेस पहुंचा सकते हैं।

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


0

मैंने 16.04 महीने पहले उबंटू पर यह कोशिश की थी। जैसा कि 0xACE ने कहा, आधुनिक OS एक बार जब आप Malloc () कहते हैं, तो एक ऑल-जीरो, वर्चुअल पेज आवंटित करता है। लेकिन, यदि आप आवंटित बफर को कुछ भी नहीं लिखते हैं, तो इसे भौतिक मेमोरी (यानी कॉपी-ऑन-राइट सिद्धांत) में मैप नहीं किया जाएगा, इस प्रकार आप हमेशा "अनइंस्टाल्यूटेड" ब्लॉक से शून्य पढ़ेंगे। हो सकता है कि बेहतर प्रदर्शन के लिए "CONFIG_MMAP_ALLOW_UNITIALIZED" विकल्प के साथ संकलित कुछ ओएस हैं, इस मामले में आप जो कुछ भी प्राप्त कर सकते हैं उसके लिए तैयार हो सकते हैं।


-1

नहीं, यह पेजिंग के जादू की बदौलत दूसरे प्रोग्राम की मेमोरी को पढ़ने की अनुमति नहीं देगा । इस तरह, कुल मेमोरी का उपयोग भौतिक रैम से हार्डड्राइव के कुछ हिस्सों को लोड करके किया जा सकता है।

इसके अलावा, अधिकतम मेमोरी जो प्रक्रिया आवंटित कर सकती है, वह ओएस (32 बिट आर्किटेक्चर के लिए 4 गीगा तक) द्वारा मनमाने ढंग से सीमित है जिसके बाद अगली allocकॉल मेमोरी त्रुटि से बाहर आएगी।


क्या प्लेटफ़ॉर्म विशिष्ट API नहीं हैं जो इसे दरकिनार कर सकते हैं? मैं ईमानदारी से नहीं जानता, लेकिन मुझे आश्चर्य नहीं होगा (उदाहरण के लिए, लिनक्स ओएस को भौतिक मेमोरी से पृष्ठ को आगे बढ़ने से रोकने की अनुमति देता है mlock)।

यदि 4 जीबी रैम है और पेजिंग 8 जीबी तक सीमित है, तो क्या होगा यदि आवेदन 12 जीबी (एक्स 64 पर) का अनुरोध करता है?
आर्सेनी मूरज़ेंको

तब सिस्टम कॉल में एक त्रुटि वापस आनी चाहिए जब बहुत कम मुक्त मेमोरी रहेगी, या कंप्यूटर बस एक पड़ाव में पीस जाएगा जब कोई बचा नहीं है ...
शाफ़्ट सनकी

4
वह दूसरे की मेमोरी को पढ़ने के बारे में नहीं पूछ रहा है, बल्कि उनकी RELEASED मेमोरी को पढ़ रहा है। राम का वह खंड वर्तमान में स्वतंत्र है, और .... मुझे नहीं लगता ... कि पेजिंग योजनाएं शून्य हो जाने के बाद स्मृति को शून्य कर देती हैं। इसलिए यह कार्यक्रम मेमोरी के एक ब्लॉक को आवंटित करेगा, और पहले से वहां मौजूद अनइंस्टाल्यूटेड डेटा का विश्लेषण करेगा।
फिलिप

@philip सही, मैं विशेष रूप से जारी की गई मेमोरी के बारे में पूछ रहा हूं।
ConditionRacer
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.