2010-05-01 10 views
8

संरेखण और ग्रैन्युलरिटी specification of mmap द्वारा मुझे उलझन में है।एमएमएपी

pa mmap (विनिर्देश के समान)

पा = mmap (addr, लेन, prot, झंडे, fildes, बंद) की वापसी पता होने दो;

समारोह कॉल के बाद मेरी राय निम्न श्रेणी सफल होने में मान्य है

[पा, पा + लेन)

मेरा प्रश्न है कि क्या निम्नलिखित की सीमा है अब भी मान्य?

[round_down (PA, pagesize), round_up (PA + लेन, pagesize))
[आधार, लघु

के लिए आधार + आकार] कहने के लिए है कि:

  1. base हमेशा पृष्ठ सीमा पर गठबंधन है?
  2. size हमेशा पेजसाइज का एक बहु है (ग्रैन्युलरिटी दूसरे शब्दों में पृष्ठबद्ध है)?

आपकी सहायता के लिए धन्यवाद।

मुझे लगता है कि इस अनुच्छेद में निहित है:

बंद तर्क जब _SC_PAGESIZE या _SC_PAGE_SIZE पारित कर दिया sysconf() द्वारा दिए गए मान के अनुसार गठबंधन और आकार होने के लिए विवश है। जब MAP_FIXED निर्दिष्ट किया गया है, तो एप्लिकेशन यह सुनिश्चित करेगा कि तर्क addr भी इन बाधाओं को पूरा करता है। कार्यान्वयन पूरे पृष्ठों पर मानचित्रण संचालन करता है। इस प्रकार, जबकि तर्क लेन को किसी आकार या संरेखण बाधा को पूरा करने की आवश्यकता नहीं होती है, कार्यान्वयन में किसी मैपिंग ऑपरेशन में, श्रेणी [pa, pa + len) द्वारा निर्दिष्ट किसी भी आंशिक पृष्ठ शामिल होगा।

लेकिन मुझे यकीन नहीं है और मुझे पॉज़िक्स पर अधिक अनुभव नहीं है।

  • कृपया मुझे कुछ और स्पष्ट और अधिक निश्चित सबूत
  • दिखाने या मुझे कम से कम एक दिखाने प्रणाली है जो POSIX समर्थन करता है और अलग व्यवहार

धन्यवाद फिर से है।

उत्तर

3

आपका प्रश्न काफी खुला है, इस बात पर विचार करते हुए कि एमएमएपी में कई अलग-अलग तरीके और कॉन्फ़िगरेशन हैं, लेकिन मैं सबसे महत्वपूर्ण बिंदुओं को कवर करने का प्रयास करूंगा।

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

MMAP_ANONYMOUS के लिए, हालांकि, स्मृति संभवतः लिखने योग्य है - लेकिन फिर, यह स्मृति का उपयोग करना मूर्ख नहीं होगा।

इसके अतिरिक्त, जब आप mmap() का उपयोग कर रहे हैं, तो आप वास्तव में mmap() के glibc के संस्करण का उपयोग कर रहे हैं, और यह फिट हो सकता है, फिर भी यह स्लाइस और पासा मेमोरी कर सकता है। अंत में, यह ध्यान देने योग्य है कि ओएसएक्स पर, जो पॉज़िक्स अनुपालन है, आपके द्वारा प्रस्तुत उद्धृत पाठ में से कोई भी एमएमएपी() के लिए मैन पेज में दिखाई देता है।

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