मुझे हाईम और लोएमेम के बीच अंतर में दिलचस्पी है:
- ऐसा भेदभाव क्यों है?
- ऐसा करने से हमें क्या हासिल होता है?
- प्रत्येक में क्या विशेषताएं हैं?
मुझे हाईम और लोएमेम के बीच अंतर में दिलचस्पी है:
जवाबों:
32-बिट आर्किटेक्चर पर, रैम को संबोधित करने के लिए पता स्थान सीमा है:
0x00000000 - 0xffffffff
या 4'294'967'295
(4 जीबी)।
लिनक्स कर्नेल बंटता है जो क्रमशः 3/1 (2/2 या 1/3 1 ) तक उपयोगकर्ता स्थान (उच्च मेमोरी) और कर्नेल स्थान (कम मेमोरी) में विभाजित हो सकता है।
उपयोगकर्ता अंतरिक्ष रेंज:
0x00000000 - 0xbfffffff
हर नव-प्रायोजित उपयोगकर्ता प्रक्रिया को इस क्षेत्र के अंदर एक पता (श्रेणी) मिलता है। उपयोगकर्ता प्रक्रियाएं आमतौर पर अविश्वसनीय होती हैं और इसलिए कर्नेल स्थान तक पहुंचने के लिए मना किया जाता है। इसके अलावा, उन्हें गैर-जरूरी माना जाता है, एक सामान्य नियम के रूप में, कर्नेल उन प्रक्रियाओं को स्मृति के आवंटन को स्थगित करने का प्रयास करता है।
कर्नेल स्पेस रेंज:
0xc0000000 - 0xffffffff
एक कर्नेल प्रक्रियाएं यहां अपना पता (सीमा) प्राप्त करती हैं। कर्नेल सीधे पते के इस 1 जीबी तक पहुंच सकता है (अच्छी तरह से, पूर्ण 1 जीबी नहीं, उच्च मेमोरी एक्सेस के लिए 128 एमबी आरक्षित हैं)।
कर्नेल स्थान में उत्पन्न प्रक्रियाएँ विश्वसनीय, अत्यावश्यक और त्रुटि रहित मानी जाती हैं, मेमोरी अनुरोध तुरंत संसाधित हो जाता है।
प्रत्येक कर्नेल प्रक्रिया उपयोगकर्ता स्पेस रेंज तक भी पहुँच सकती है यदि वह चाहे तो। और इसे प्राप्त करने के लिए, कर्नेल उपयोगकर्ता के स्थान (उच्च मेमोरी) से उसके कर्नेल स्थान (निम्न मेमोरी) के पते को मैप करता है, ऊपर वर्णित 128 एमबी इसके लिए विशेष रूप से आरक्षित हैं।
1 क्या विभाजन 3/1, 2/2, या 1/3 CONFIG_VMSPLIT_...
विकल्प द्वारा नियंत्रित किया जाता है; आप शायद यह देखने के /boot/config*
लिए जांच कर सकते हैं कि आपके कर्नेल के लिए कौन सा विकल्प चुना गया था।
लिनक्स डिवाइस ड्राइवर (ऑनलाइन और पुस्तक दोनों रूपों में उपलब्ध), विशेष रूप से अध्याय 15, जो विषय पर एक खंड है , को चालू करने का पहला संदर्भ है ।
एक आदर्श दुनिया में, हर सिस्टम कंपोनेंट उन सभी मेमोरी को मैप करने में सक्षम होगा, जिन्हें कभी एक्सेस करने की आवश्यकता होती है। और यह लिनक्स और अधिकांश ऑपरेटिंग सिस्टम पर प्रक्रियाओं के लिए मामला है: एक 32-बिट प्रक्रिया केवल वर्चुअल मेमोरी की 2 ^ 32 बाइट्स से थोड़ी कम (आमतौर पर एक विशिष्ट लिनक्स 32-बिट आर्किटेक्चर पर 3 जीबी के बारे में) एक्सेस कर सकती है। यह कर्नेल के लिए मुश्किल हो जाता है, जिसे उस प्रक्रिया की पूरी मेमोरी को मैप करने में सक्षम होने की आवश्यकता होती है जिसका सिस्टम इसे निष्पादित कर रहा है, साथ ही पूरी भौतिक मेमोरी, साथ ही किसी अन्य मेमोरी-मैपेड हार्डवेयर डिवाइस।
इसलिए जब एक 32-बिट कर्नेल को 4GB से अधिक मेमोरी को मैप करने की आवश्यकता होती है, तो इसे उच्च मेमोरी समर्थन के साथ संकलित किया जाना चाहिए। उच्च मेमोरी वह मेमोरी होती है जिसे कर्नेल के एड्रेस स्पेस में स्थायी रूप से मैप नहीं किया जाता है। (कम मेमोरी इसके विपरीत है: यह हमेशा मैप की जाती है, इसलिए आप इसे पॉइंटर को केवल एक पॉइंटर को पॉइंटर करके एक्सेस कर सकते हैं।)
जब आप कर्नेल कोड से उच्च मेमोरी एक्सेस करते हैं, तो आपको kmap
पृष्ठ डेटा संरचना ( struct page
) से पॉइंटर प्राप्त करने के लिए, पहले कॉल करना होगा । कॉलिंग kmap
कार्य करता है कि पृष्ठ उच्च या निम्न मेमोरी में है या नहीं। वहाँ भी है kmap_atomic
जो बाधाओं को जोड़ा गया है, लेकिन मल्टीप्रोसेसर मशीनों पर अधिक कुशल है क्योंकि यह महीन दाने वाली लॉकिंग का उपयोग करता है। के माध्यम से प्राप्त सूचक kmap
एक संसाधन है: यह पता स्थान का उपयोग करता है। एक बार जब आप इसके साथ समाप्त हो जाते हैं, तो आपको उस संसाधन को मुक्त करने के लिए कॉल kunmap
(या kunmap_atomic
) करना होगा ; तब पॉइंटर अब मान्य नहीं है, और जब तक आप kmap
फिर से कॉल नहीं करते तब तक पेज की सामग्री को एक्सेस नहीं किया जा सकता है ।
यह लिनक्स कर्नेल के लिए प्रासंगिक है; मुझे यकीन नहीं है कि कोई भी यूनिक्स कर्नेल इसे कैसे संभालता है।
हाई मेमोरी मेमोरी का वह सेगमेंट है जिसे यूजर-स्पेस प्रोग्राम संबोधित कर सकते हैं। यह कम मेमोरी को नहीं छू सकता है।
कम मेमोरी मेमोरी का वह खंड है जिसे लिनक्स कर्नेल सीधे संबोधित कर सकता है। यदि कर्नेल को उच्च मेमोरी तक पहुंच प्राप्त करनी है, तो उसे पहले अपने स्वयं के पते के स्थान पर मैप करना होगा।
हाल ही में एक पैच पेश किया गया था जो आपको नियंत्रित करता है कि खंड कहां है। ट्रेडऑफ़ यह है कि आप पते योग्य मेमोरी को उपयोगकर्ता स्थान से दूर ले जा सकते हैं ताकि कर्नेल में अधिक मेमोरी हो सके जिसका उपयोग करने के लिए उसे मैप न करना पड़े।
अतिरिक्त संसाधन:
HIGHMEM कर्नेल की मेमोरी स्पेस की एक सीमा है, लेकिन यह आपके द्वारा एक्सेस की जाने वाली मेमोरी नहीं है, बल्कि यह एक ऐसी जगह है, जहां आप वह एक्सेस करते हैं, जिसे आप एक्सेस करना चाहते हैं।
एक विशिष्ट 32 बिट लिनक्स वर्चुअल मेमोरी मैप इस प्रकार है:
0x00000000-0xbfffffff: उपयोगकर्ता प्रक्रिया (3GB)
0xc0000000-0xffffffff: कर्नेल स्थान (1GB)
(सीपीयू-विशिष्ट वेक्टर और जो भी यहां नजरअंदाज किया गया है)।
लिनक्स 1GB कर्नेल स्थान को 2 टुकड़ों, LOWMEM और HIGHMEM में विभाजित करता है। विभाजन स्थापना से स्थापना तक भिन्न होता है।
यदि कोई इंस्टॉलेशन चुनता है, तो कहें, 512MB-512MB LOW और हाई मेम के लिए, 512MB LOWMEM (0xc0000000-0xdfffffff) कर्नेल बूट टाइम पर स्टेटिकली मैप किया गया है; आमतौर पर भौतिक मेमोरी के पहले इतने बाइट्स का उपयोग इसके लिए किया जाता है ताकि इस सीमा में वर्चुअल और भौतिक पते में लगातार ऑफसेट हो, कहे, 0xc0000000।
दूसरी ओर, बाद वाले 512MB (HIGHMEM) में कोई स्थैतिक मानचित्रण नहीं है (हालाँकि आप पृष्ठों को अर्द्ध-स्थाई रूप से मैप कर सकते हैं, लेकिन आपको अपने ड्राइवर कोड में स्पष्ट रूप से ऐसा करना होगा)। इसके बजाय, पृष्ठों को अस्थायी रूप से मैप किया जाता है और यहां अनमैप किया जाता है ताकि इस श्रेणी के वर्चुअल और भौतिक पते में लगातार मैपिंग न हो। हाईमेम के विशिष्ट उपयोगों में एकल-समय डेटा बफ़र्स शामिल हैं।
कई लोगों ने कहा है कि कम मेमोरी ऑपरेटिंग सिस्टम के लिए है। यह आमतौर पर सच है लेकिन होना नहीं है। उच्च मेमोरी और कम मेमोरी मेमोरी स्पेस के केवल दो भाग हैं, लेकिन लिनक्स सिस्टम में कम मेमोरी केवल कर्नेल और उच्च मेमोरी के लिए उपयोगकर्ता प्रक्रियाओं के लिए है।
"डायनासॉर बुक (ऑपरेटिंग सिस्टम कॉन्सेप्ट्स)" के अनुसार, हम ऑपरेटिंग सिस्टम को कम मेमोरी या उच्च मेमोरी में रख सकते हैं। इस निर्णय को प्रभावित करने वाला प्रमुख कारक बाधित वेक्टर का स्थान है। चूंकि बाधित वेक्टर अक्सर कम मेमोरी में होता है, प्रोग्रामर आमतौर पर ऑपरेटिंग सिस्टम को कम मेमोरी में भी रखते हैं।