2011-12-14 13 views
13

कहें कि मैं निम्नानुसार/dev/zero का उपयोग करके mmap के साथ एक बड़ी मेमोरी (40 एमबी) आवंटित करता हूं।एमएमएपी/dev/zero

fd = open("/dev/zero", O_RDWR); 
a = mmap (0, 4096e4, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_FILE, fd, 0); 

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

क्या मेरी समझ सही है?

+2

लघु जवाब: हाँ – hirschhornsalz

+0

जब तक स्पर्श का मतलब है के रूप में लिखते हैं, हाँ। अन्यथा, यदि आप केवल शून्य पृष्ठ से पढ़ते हैं, तो वास्तव में एक शून्य पृष्ठ होता है, जिसे पहले लिखने पर गाय किया जाएगा। – ninjalj

+0

यह एंड्रॉइड 5.0 पर कड़ी मेहनत कर देगा, क्योंकि SELinux इस तरह की अजीबता को अवरुद्ध करेगा। यही कारण है कि क्रोम में इंकस्केप एंड्रॉइड पर शुरू नहीं होता है। – pelya

उत्तर

11

हां, यदि आप उन्हें पहली बार स्पर्श करते हैं तो पृष्ठों को और भी अस्तित्व में लाया जाता है।

बीटीडब्ल्यू, ध्वज MAP_ANONYMOUS है जिसे आप इस स्थिति में उपयोग कर सकते हैं, /dev/null पर फ़ाइल डिस्क्रिप्टर खोलने की आवश्यकता नहीं है।

+0

MAP_ANONYMOUS मेमोरी 0 भी बनाता है? क्या होगा यदि मैं नहीं चाहता कि स्मृति शून्य हो, तो शून्य को यादों को शुरू करने के ऊपरी हिस्से से बचने के लिए? तब मुझे क्या उपयोग करना चाहिए? – MetallicPriest

+6

@ मेटालिक प्रिस्ट कुछ भी नहीं। कोई भी गैर-प्रारंभिक गैर-फ़ाइल-समर्थित स्मृति जो किसी अन्य प्रक्रिया या कर्नेल की स्मृति की सामग्री का संभावित रिसाव है। – ephemient

+3

यदि आप ज़ीरो से भरे स्थान को नहीं चाहते हैं तो/dev/zero के बजाय/dev/urandom का उपयोग करें? :) कर्नेल में आपको कोई स्मृति देने वाला कोई व्यवसाय नहीं है जिसमें किसी अन्य प्रोग्राम से चलने वाले किसी अन्य प्रोग्राम से बचे हुए हो सकते हैं - यह एक सुरक्षा जोखिम है। –