2016-03-28 6 views
7

मैप किया मैं mmap का उपयोग कर मानचित्रण कर्नेल मोड अंतरिक्ष के लिनक्स में तंत्र उपयोगकर्ता मोड अंतरिक्ष में समझने की कोशिश।कैसे है स्मृति की शारीरिक रचना कर्नेल अंतरिक्ष

सबसे पहले मैं एक लोड करने योग्य कर्नेल मॉड्यूल (लाइन किमी) जो mmap -functionality के साथ एक चरित्र उपकरण प्रदान करता है। फिर उपयोगकर्ता स्पेस एप्लिकेशन डिवाइस खोलता है और mmap को एलकेएम कर्नेल मोड स्पेस (आभासी उच्च पता) के अंदर एलकेएम के ढेर पर मेमोरी स्पेस आवंटित करता है। उपयोगकर्ता स्पेस साइड पर डेटा पॉइंटर आभासी कम पते पर इंगित करता है।

निम्नलिखित चित्र दिखाता है कि मैं स्मृति की शारीरिक रचना कैसे कल्पना करता हूं। क्या यह सही है?

Memory mapping

कृपया मुझे अधिक विवरण जोड़ने की कोशिश करेंगे मुझे पता है अगर सवाल स्पष्ट नहीं है करते हैं,।


संपादित करें: चित्र गिल हैमिल्टन के संबंध में संपादित किया गया था। काला तीर अब एक भौतिक पते को इंगित करता है।

+2

हां। यह मूल रूप से सही है। मैं इसे दाईं ओर इशारा करते हुए भारी काले तीर से खींचूंगा। यही है, यह वही भौतिक पृष्ठ साझा कर रहा है। यह कर्नेल के समान वर्चुअल पता नहीं मिलता है और यह किसी भी तरह से कर्नेल डेटा क्षेत्र को "इंगित नहीं करता" है। इसके बजाए यह एक ही भौतिक स्मृति पृष्ठों पर अपना स्वतंत्र मैपिंग प्राप्त करता है। –

+0

अक्सर मैं पढ़ सकता हूं कि लिनक्स में प्रत्येक थ्रेड को एक वर्चुअल मेमोरी क्षेत्र 1 जीबी कर्नेल और 3 जीबी उपयोगकर्ता स्पेस में विभाजित किया जाता है। इस मामले में: कर्नेल मॉड्यूल के कुछ हिस्सों को उपयोगकर्ता अंतरिक्ष अनुप्रयोग के कर्नेल स्पेस भाग के अंदर रखना है? – Alex44

+1

हां। उस मॉडल में, कर्नेल वर्चुअल एड्रेस स्पेस शीर्ष 1 जीबी (x86 32 बिट के लिए) है। उपयोगकर्ता-मोड स्पेस नीचे 3 जीबी है। तो वे 4 जीबी आभासी पता स्थान साझा करते हैं। जब कोई संदर्भ स्विच होता है, तो एक नई पृष्ठ तालिका स्थापित होती है। शीर्ष 1 जीबी के लिए यह वही मैपिंग है लेकिन नई प्रक्रिया के उपयोगकर्ता मोड के लिए नए मैपिंग्स हैं। हालांकि, उपयोगकर्ता मोड शीर्ष 1 जीबी तक कभी भी नहीं पहुंच सकता है (यानी अगर वह उस मेमोरी तक पहुंचने का प्रयास करता है, तो उसे पृष्ठ तालिका एक्सेस प्रतिबंधों के कारण 'SIGSEGV' प्राप्त होगा)। कर्नेल मोड * तकनीकी रूप से उपयोगकर्ता-मोड स्पेस को सीधे एक्सेस कर सकता है, हालांकि यह आमतौर पर एपीआई के माध्यम से किया जाता है। –

उत्तर

0

ड्राइंग कुछ महत्वपूर्ण अंतर्निहित मान्यताओं को याद कर रही है।

गिरी उपयोगकर्ता अंतरिक्ष स्मृति का उपयोग करने के लिए mmap() की जरूरत नहीं है। यदि किसी उपयोगकर्ता की प्रक्रिया में स्मृति है, तो यह पहले से ही परिभाषा के अनुसार पता स्थान में मैप किया गया है। उस अर्थ में, स्मृति पहले से ही उपयोगकर्ता और कर्नेल के बीच साझा की जाती है।

mmap() उपयोगकर्ता के आभासी पता स्थान में एक नया क्षेत्र बनाता है, ताकि बाद में पहुंचने पर पता क्षेत्र भौतिक स्मृति द्वारा पॉप्युलेट किया जा सके। स्मृति का वास्तविक आवंटन और पृष्ठ तालिका प्रविष्टि को संशोधित करना कर्नेल द्वारा किया जाता है।

mmap() केवल वर्चुअल ऐड्रेस स्पेस के उपयोगकर्ता आधे के प्रबंधन के लिए समझ में आता है। पता स्थान का कर्नेल-आधा पूरी तरह से अलग तरीके से प्रबंधित किया जाता है।

इसके अलावा, कर्नेल-आधा सिस्टम में सभी प्रक्रियाओं द्वारा साझा किया जाता है। प्रत्येक प्रक्रिया में इसकी समर्पित आभासी पता स्थान होती है, लेकिन पृष्ठ सारणी इस तरह से प्रोग्राम की जाती हैं कि कर्नेल-आधे के लिए पृष्ठ तालिका प्रविष्टियां सभी प्रक्रियाओं के लिए बिल्कुल समान होती हैं।

फिर, गिरी उपयोगकर्ता अंतरिक्ष स्मृति तक पहुँचने के लिए नहीं mmap() करता है। mmap() उपयोगकर्ता की वर्चुअल एड्रेस स्पेस में मौजूदा मैपिंग को संशोधित करने के लिए कर्नेल द्वारा उपयोगकर्ता को प्रदान की जाने वाली एक सेवा है।

Btw, गिरी वास्तव में अगर यह करना चाहता है उपयोगकर्ता स्मृति का उपयोग करने के कुछ तरीके हैं।

सबसे पहले, कर्नेल में कर्नेल पता स्थान (इसके कर्नेल स्पेस के हिस्से के रूप में) का एक समर्पित क्षेत्र है जो लगातार फैशन में मौजूद भौतिक स्मृति की संपूर्णता को मानचित्र करता है। (यह सभी 64-बिट सिस्टम में सच है। 32-बिट सिस्टम में कर्नेल को इसे प्राप्त करने के लिए ऑन-द-फ्लाई को 'रीमेप' करना होगा।)

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

तीसरा, यदि कर्नेल एक हस्तक्षेप संदर्भ में निष्पादित करते समय एक प्रक्रिया के उपयोगकर्ता स्थान सूचक को अव्यवस्थित करना चाहता है जैसे कि एक इंटरप्ट हैंडलर में, कर्नेल vm_area_struct पेड़ को अनुमति के लिए और पृष्ठ तालिका को चलने के लिए प्रक्रिया के आभासी पते का पता लगा सकता है वास्तविक भौतिक पृष्ठ फ्रेम का पता लगाएं।

0

आप वर्तमान के माध्यम से वीएमए के "संरचना vm_area_struct" के माध्यम से स्मृति क्षेत्रों को फिर से देखकर देख सकते हैं।

यदि आप पैगेटेबल चलते हैं और वर्चुअल पतों के लिए मैप किए गए भौतिक पते प्राप्त करते हैं जो उपयोगकर्ता स्थान से संबंधित नहीं हैं तो स्मृति लेआउट अधिक स्पष्ट होगा।

इसके अलावा आंकड़े में यह मामूली सुधार से, बीएसएस एक खंड लेकिन अनुभाग जो, डेटा खंड के लिए एम्बेड कर रहा है अधिक जानकारी के लिए ELF विनिर्देश देखें, लिंकर स्क्रिप्ट नहीं है

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