2011-11-02 6 views
5

अगर मैं mmap() कुछ निजी और बेनामी पृष्ठों है और फिर उनके साथ विस्तार mremap(), नई अंतरिक्ष भी शून्य के लिए शुरू होता है?क्या Mremap विकास पर स्मृति "प्रारंभ" करता है?

मैं लिनक्स स्रोत में mremap के लिए कोड (मिमी/mremap.c) पढ़ने की कोशिश की है लेकिन यह कुछ डोमेन विशिष्ट ज्ञान है कि मैं वर्तमान में ऐसा नहीं (VMA _ ### सामान) है की आवश्यकता है। भी यकीन है कि ऐसा नहीं है कि,, सही जगह देखने के लिए है ...

लेकिन से मैं क्या इकट्ठा किया है मुझे लगता है कि कि mremap() एड स्मृति साफ हो जाएगा कि यह सही है?

आवंटन इस

list = mmap(NULL, newSize, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0) 

तरह से किया जाता है और उसके बाद remap इस

newList = mremap(list, oldSize, newSize, MREMAP_MAYMOVE) 

आह की तरह किया जाता है, और पिछले, यह एक लिनक्स विशिष्ट सवाल है, हाल ही में एक कर्नेल चला रहे हैं (> = 2.6.28) और libc (> = 2.11.1)

उत्तर

4

बेनामी पृष्ठ वें की प्रति-लिखने वाली मैपिंग हैं ई सार्वभौमिक शून्य पृष्ठ। वे हमेशा (प्रत्येक प्रणाली पर, केवल लिनक्स नहीं, जो अनाम मैपिंग प्रदान करता है) और हमेशा होगा। जब mremap (या brk) अज्ञात मैपिंग बढ़ाता है, तो आपको नया अनाम (शून्य) पृष्ठ मिलता है। उन्हें स्वयं शुरू करने की कोई आवश्यकता नहीं है।

+0

हाँ। शून्य पेजों के अलावा कुछ भी एक सुरक्षा छेद होगा। –

+0

आप सार्वभौमिक शून्य पृष्ठ की कॉपी-ऑन-राइट मैपिंग के बारे में गलत हैं। कम से कम लिनक्स पर यह नहीं है कि 'mmap()' कैसे काम करता है। आपको मैप किए गए मेमोरी की पहली पहुंच पर मैप किए गए भौतिक पृष्ठ मिलते हैं, और यह कर्नेल पेज गलती हैंडलर है जो भौतिक पृष्ठ को शून्य करता है और इसे मानचित्र करता है। कोई सार्वभौमिक शून्य पेज शामिल नहीं है। –

+1

क्या आप निश्चित हैं? निश्चित रूप से केवल पढ़ने के लिए अज्ञात मैपिंग के लिए यह प्रत्येक पृष्ठ के लिए एक भौतिक पृष्ठ नहीं बनाता है। मैंने जो कहा है, वह निश्चित रूप से एक अर्थ में सच है यदि आप डुप्लिकेट पृष्ठों के विलय को सक्षम करते हैं, लेकिन मैं सामान्य रूप से गलत हो सकता हूं; मैंने RTFS'd नहीं किया है या इसका परीक्षण नहीं किया है। –

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