2016-05-06 4 views
16

मैं एक सी/सी ++ प्रोग्राम बनाने की कोशिश कर रहा हूं जो जितना संभव हो उतना अनियमित स्मृति को डंप करता है। कार्यक्रम को स्थानीय उपयोगकर्ता द्वारा चलाया जाना चाहिए, यानी उपयोगकर्ता मोड में।जितना संभव हो उतना अनियमित स्मृति प्राप्त करना

यह malloc उपयोग करने के लिए काम नहीं करता: Why does malloc initialize the values to 0 in gcc?

लक्ष्य अनियमितता के लिए एक बीज के रूप में इस डेटा का उपयोग करने के लिए नहीं है।

क्या ओएस हमेशा यह सुनिश्चित करता है कि आप अन्य प्रक्रियाओं से "बचे हुए" नहीं देख सकते हैं?

यदि संभव हो, तो मुझे कार्यान्वयन या आगे स्पष्टीकरण के संदर्भ चाहिए।

+1

आपको इसके लिए क्या चाहिए? क्या आप यादृच्छिक मूल्य प्राप्त करने की कोशिश कर रहे हैं? – dbush

+3

एक एक्सवाई समस्या की तरह लगता है। –

+1

शायद यह जिज्ञासा से बाहर है और/या सीखने की जरूरत है। एक वैध सवाल या तो रास्ता। –

उत्तर

6

आपको अनियमित स्मृति मिली है। इसमें अनिश्चित मूल्य हैं। आपके मामले में वे मान सभी 0 हैं। कुछ भी अप्रत्याशित नहीं है। यदि आप छद्म यादृच्छिक संख्या पीआरएनजी का उपयोग करना चाहते हैं। यदि आप वास्तविक यादृच्छिक संख्या/एंट्रॉपी चाहते हैं, तो अपने ऑपरेटिंग सिस्टम के यादृच्छिक संख्या डिवाइस (उदा। /dev/urandom) या एपीआई जैसे वैध यादृच्छिक स्रोत का उपयोग करें।

+0

लक्ष्य यादृच्छिकता के लिए डेटा का उपयोग नहीं करना है। (मैंने सवाल अपडेट किया)। बस यह पता लगाने के लिए कि क्या मैं अन्य प्रक्रियाओं से "बचे हुए" प्राप्त कर सकता हूं। – user144437

+7

आप नहीं कर सकते। यह किसी गैर-खिलौने ओएस के विशेषाधिकार मॉडल का एक मौलिक हिस्सा है। –

+3

@ user144437 मैं अनुमान लगाता हूं कि संभवतः आप ऐसा करने का प्रयास कर रहे हैं, इस बात का कुछ संबंध है कि ओएसई आपको ऐसा करने की अनुमति क्यों नहीं देता है। –

3

किसी भी ऑपरेटिंग सिस्टम को अपने सही दिमाग में एक प्रक्रिया में अनियमित स्मृति प्रदान करने जा रहा है।

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

+3

"अपने सही दिमाग में कोई ऑपरेटिंग सिस्टम प्रक्रिया के लिए अनियमित स्मृति प्रदान करने जा रहा है।" स्रोत? – user144437

+1

आप गलत हैं। यदि आप मॉलोक के साथ मेमोरी आवंटित करते हैं, तो स्मृति सिस्टम gargabe के साथ आता है। यह शुरू नहीं हुआ है। इसके अलावा, एक ऑपरेटिंग सिस्टम में कोई दिमाग नहीं है। –

+0

जब यह पृष्ठ तार्किक पता स्थान पर मैप किया जाता है तो यह "ढेर" में जाने से पहले प्रारंभ होता है। – user3344003

11

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

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

विंडोज़ पर अधिक जानकारी के लिए, आप ओएस थ्रेड के बारे में जानने के लिए Windows zero page thread खोज सकते हैं जिसका एकमात्र काम अप्रयुक्त पृष्ठों में शून्य लिखना है ताकि उन्हें दोबारा बाहर निकाला जा सके। इसके अलावा, विंडोज़ में superfetch नामक एक सुविधा है जो अप्रयुक्त RAM को उन फ़ाइलों के साथ भरती है जो विंडोज भविष्यवाणी करते हैं कि आप जल्द ही खोलना चाहेंगे। यदि आपने स्मृति आवंटित की है और विंडोज ने आपको एक सुपरफ़ेच पेज देने का निर्णय लिया है, तो आपको एक ऐसी फाइल की सामग्री दिखाई देगी जो आपको पढ़ने के लिए उपयोग नहीं है। यह एक और कारण है कि पृष्ठों को किसी प्रक्रिया में आवंटित किए जाने से पहले साफ़ किया जाना चाहिए।

2

यह सामान्य ज्ञान है। हमें उस 1 + 1 = 2 को दस्तावेज करने की आवश्यकता नहीं है।

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

वास्तव में ऐसा करने का कोई और तरीका नहीं है।

विशेष उद्देश्य ऑपरेटिंग सिस्टम हो सकते हैं जो ऐसा नहीं करते हैं और प्रक्रियाओं के बीच रिसाव रहस्य करते हैं (उदाहरण के लिए वास्तविक समय आवश्यकताओं के लिए यह आवश्यक हो सकता है)। कुछ पुराने ऑपरेटिंग सिस्टम में सभ्य स्मृति प्रबंधन और विशेषाधिकार अलगाव नहीं था। इसके अलावा, malloc उसी प्रक्रिया के भीतर पहले से मुक्त स्मृति का पुन: उपयोग करेगा। इसलिए malloc को अनियमित कचरा रखने के लिए दस्तावेज किया जाएगा। लेकिन इसका मतलब यह नहीं है कि आप कभी भी एक सामान्य उद्देश्य ऑपरेटिंग सिस्टम पर किसी अन्य प्रक्रिया से अनियमित स्मृति प्राप्त करने में सक्षम होंगे।

मुझे लगता है कि अंगूठे का एक साधारण नियम यह है: यदि आपका ऑपरेटिंग सिस्टम कभी आपको पासवर्ड के लिए पूछता है तो यह किसी प्रक्रिया के लिए प्रारंभिक पृष्ठ नहीं देगा और चूंकि शून्यकरण पृष्ठों को प्रारंभ करने का एकमात्र उचित तरीका है, इसलिए उन्हें शून्य किया जाएगा।

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

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