लिनक्स पर उच्च मेमोरी और कम मेमोरी क्या हैं?


92

मुझे हाईम और लोएमेम के बीच अंतर में दिलचस्पी है:

  1. ऐसा भेदभाव क्यों है?
  2. ऐसा करने से हमें क्या हासिल होता है?
  3. प्रत्येक में क्या विशेषताएं हैं?

@hiro, आपका मतलब है कि "HIGHMEM" ldd3 द्वारा वर्णित "कर्नेल वर्चुअल एड्रेस" है। मैं आपसे सहमत हुँ। यह भ्रामक है, ldd3 परिभाषित "LOWMEM" "HIGHMEM", "कर्नेल वर्चुअल एड्रेस" "कर्नेल लॉजिक एड्रेस" भी परिभाषित किया गया है। वे एक ही चीज हैं, लेकिन अलग नाम है। यह सॉफ्टवेयर की "सुंदरता" है, यह इतना वर्णन-भाषा-निर्भर है।
चरण

जवाबों:


69

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*लिए जांच कर सकते हैं कि आपके कर्नेल के लिए कौन सा विकल्प चुना गया था।


यह पुराना है और मुझे यकीन नहीं है कि आप यहाँ हैं। लेकिन मैं एक बात पूछना चाहता हूं: कर्नेल स्पेस (उच्च मेमोरी एक्सेस के लिए) में आरक्षित 128 एमबी, क्या यह उपयोगकर्ता-स्पेस मेमोरी क्षेत्र के सभी संदर्भ हैं? तो, एक कर्नेल प्रक्रिया इस क्षेत्र को संदर्भित करके किसी भी उपयोगकर्ता स्थान तक पहुंच सकती है, है ना?
अमुमू

1
यह हमेशा 1/4 के क्यों होता है? यानी यह इसे 5/1 या कुछ और क्यों नहीं विभाजित कर सका?
मंगल

वास्तव में "सीधे पहुंच" का क्या मतलब है? मेरा मतलब है, क्या कर्नेल स्वयं वर्चुअल मेमोरी तंत्र के माध्यम से नहीं पहुँचा है?
टेलीन

1
मेरा मानना ​​है कि आप उच्च / निम्न मेमोरी के बारे में जो कहते हैं, वह गलत है: मेरा मानना ​​है कि शुद्ध 32 बिट सिस्टम में, कर्नेल सीधे 3GB उपयोगकर्ता स्थान तक पहुँच सकता है (कर्नेल कर्नेल स्थान और उपयोगकर्ता स्थान तक पहुँच सकता है)। हालाँकि जब आपके पास एक पीएई कर्नेल चीजें अधिक जटिल होती हैं, तो अब आपके पास 3 जीबी से अधिक रैम है, प्रत्येक प्रक्रिया 3 जीबी हो सकती है, और आप सीधे पूरे उपयोगकर्ता स्थान तक नहीं पहुंच सकते हैं। यह वह जगह है जहां कर्नेल स्पेस में उच्च मेम और 128 एमबी मेमोरी है, जिसमें आता है। 64 बिट कर्नेल के साथ यह फिर से सरल हो जाता है, कोई भी उच्च पुरुष नहीं, क्योंकि सभी उपयोगकर्ता स्पेस कर्नेल से सुलभ है।
ctrl-alt-delor 22

2
@mgalgs m, 2/4 और just केवल डिफ़ॉल्ट विकल्पों का एक सेट था जो उजागर किए गए थे। 2007 के बाद से, कोई भी 5/16 वीं और 15/32 वीं का चयन कर सकता है। यदि आपको पता है कि किस #define लाइन को संपादित करना है, तो आप अपनी खुद की लगभग मनमानी विभाजन को चुन सकते हैं।
जोर्जेंसन

28

लिनक्स डिवाइस ड्राइवर (ऑनलाइन और पुस्तक दोनों रूपों में उपलब्ध), विशेष रूप से अध्याय 15, जो विषय पर एक खंड है , को चालू करने का पहला संदर्भ है ।

एक आदर्श दुनिया में, हर सिस्टम कंपोनेंट उन सभी मेमोरी को मैप करने में सक्षम होगा, जिन्हें कभी एक्सेस करने की आवश्यकता होती है। और यह लिनक्स और अधिकांश ऑपरेटिंग सिस्टम पर प्रक्रियाओं के लिए मामला है: एक 32-बिट प्रक्रिया केवल वर्चुअल मेमोरी की 2 ^ 32 बाइट्स से थोड़ी कम (आमतौर पर एक विशिष्ट लिनक्स 32-बिट आर्किटेक्चर पर 3 जीबी के बारे में) एक्सेस कर सकती है। यह कर्नेल के लिए मुश्किल हो जाता है, जिसे उस प्रक्रिया की पूरी मेमोरी को मैप करने में सक्षम होने की आवश्यकता होती है जिसका सिस्टम इसे निष्पादित कर रहा है, साथ ही पूरी भौतिक मेमोरी, साथ ही किसी अन्य मेमोरी-मैपेड हार्डवेयर डिवाइस।

इसलिए जब एक 32-बिट कर्नेल को 4GB से अधिक मेमोरी को मैप करने की आवश्यकता होती है, तो इसे उच्च मेमोरी समर्थन के साथ संकलित किया जाना चाहिए। उच्च मेमोरी वह मेमोरी होती है जिसे कर्नेल के एड्रेस स्पेस में स्थायी रूप से मैप नहीं किया जाता है। (कम मेमोरी इसके विपरीत है: यह हमेशा मैप की जाती है, इसलिए आप इसे पॉइंटर को केवल एक पॉइंटर को पॉइंटर करके एक्सेस कर सकते हैं।)

जब आप कर्नेल कोड से उच्च मेमोरी एक्सेस करते हैं, तो आपको kmapपृष्ठ डेटा संरचना ( struct page) से पॉइंटर प्राप्त करने के लिए, पहले कॉल करना होगा । कॉलिंग kmapकार्य करता है कि पृष्ठ उच्च या निम्न मेमोरी में है या नहीं। वहाँ भी है kmap_atomicजो बाधाओं को जोड़ा गया है, लेकिन मल्टीप्रोसेसर मशीनों पर अधिक कुशल है क्योंकि यह महीन दाने वाली लॉकिंग का उपयोग करता है। के माध्यम से प्राप्त सूचक kmapएक संसाधन है: यह पता स्थान का उपयोग करता है। एक बार जब आप इसके साथ समाप्त हो जाते हैं, तो आपको उस संसाधन को मुक्त करने के लिए कॉल kunmap(या kunmap_atomic) करना होगा ; तब पॉइंटर अब मान्य नहीं है, और जब तक आप kmapफिर से कॉल नहीं करते तब तक पेज की सामग्री को एक्सेस नहीं किया जा सकता है ।


2
उत्तर के लिए धन्यवाद गिल्स .. लेकिन, मैं अभी भी पूरी अवधारणा को प्राप्त करने में सक्षम नहीं हूं। क्या आप इसमें जानकारी को कम किए बिना कृपया थोड़ा और सरल हो सकते हैं?
सेन

17

यह लिनक्स कर्नेल के लिए प्रासंगिक है; मुझे यकीन नहीं है कि कोई भी यूनिक्स कर्नेल इसे कैसे संभालता है।

हाई मेमोरी मेमोरी का वह सेगमेंट है जिसे यूजर-स्पेस प्रोग्राम संबोधित कर सकते हैं। यह कम मेमोरी को नहीं छू सकता है।

कम मेमोरी मेमोरी का वह खंड है जिसे लिनक्स कर्नेल सीधे संबोधित कर सकता है। यदि कर्नेल को उच्च मेमोरी तक पहुंच प्राप्त करनी है, तो उसे पहले अपने स्वयं के पते के स्थान पर मैप करना होगा।

हाल ही में एक पैच पेश किया गया था जो आपको नियंत्रित करता है कि खंड कहां है। ट्रेडऑफ़ यह है कि आप पते योग्य मेमोरी को उपयोगकर्ता स्थान से दूर ले जा सकते हैं ताकि कर्नेल में अधिक मेमोरी हो सके जिसका उपयोग करने के लिए उसे मैप न करना पड़े।

अतिरिक्त संसाधन:


4

HIGHMEM कर्नेल की मेमोरी स्पेस की एक सीमा है, लेकिन यह आपके द्वारा एक्सेस की जाने वाली मेमोरी नहीं है, बल्कि यह एक ऐसी जगह है, जहां आप वह एक्सेस करते हैं, जिसे आप एक्सेस करना चाहते हैं।

एक विशिष्ट 32 बिट लिनक्स वर्चुअल मेमोरी मैप इस प्रकार है:

  • 0x00000000-0xbfffffff: उपयोगकर्ता प्रक्रिया (3GB)

  • 0xc0000000-0xffffffff: कर्नेल स्थान (1GB)

(सीपीयू-विशिष्ट वेक्टर और जो भी यहां नजरअंदाज किया गया है)।

लिनक्स 1GB कर्नेल स्थान को 2 टुकड़ों, LOWMEM और HIGHMEM में विभाजित करता है। विभाजन स्थापना से स्थापना तक भिन्न होता है।

यदि कोई इंस्टॉलेशन चुनता है, तो कहें, 512MB-512MB LOW और हाई मेम के लिए, 512MB LOWMEM (0xc0000000-0xdfffffff) कर्नेल बूट टाइम पर स्टेटिकली मैप किया गया है; आमतौर पर भौतिक मेमोरी के पहले इतने बाइट्स का उपयोग इसके लिए किया जाता है ताकि इस सीमा में वर्चुअल और भौतिक पते में लगातार ऑफसेट हो, कहे, 0xc0000000।

दूसरी ओर, बाद वाले 512MB (HIGHMEM) में कोई स्थैतिक मानचित्रण नहीं है (हालाँकि आप पृष्ठों को अर्द्ध-स्थाई रूप से मैप कर सकते हैं, लेकिन आपको अपने ड्राइवर कोड में स्पष्ट रूप से ऐसा करना होगा)। इसके बजाय, पृष्ठों को अस्थायी रूप से मैप किया जाता है और यहां अनमैप किया जाता है ताकि इस श्रेणी के वर्चुअल और भौतिक पते में लगातार मैपिंग न हो। हाईमेम के विशिष्ट उपयोगों में एकल-समय डेटा बफ़र्स शामिल हैं।


3

जहां तक ​​मुझे याद है, "हाई मेमोरी" का उपयोग एप्लिकेशन स्पेस और कर्नेल के लिए "लो मेमोरी" के लिए किया जाता है।

लाभ यह है कि (उपयोगकर्ता-स्थान) अनुप्रयोग कर्नेल-स्थान मेमोरी तक नहीं पहुँच सकते।


0

कई लोगों ने कहा है कि कम मेमोरी ऑपरेटिंग सिस्टम के लिए है। यह आमतौर पर सच है लेकिन होना नहीं है। उच्च मेमोरी और कम मेमोरी मेमोरी स्पेस के केवल दो भाग हैं, लेकिन लिनक्स सिस्टम में कम मेमोरी केवल कर्नेल और उच्च मेमोरी के लिए उपयोगकर्ता प्रक्रियाओं के लिए है।

"डायनासॉर बुक (ऑपरेटिंग सिस्टम कॉन्सेप्ट्स)" के अनुसार, हम ऑपरेटिंग सिस्टम को कम मेमोरी या उच्च मेमोरी में रख सकते हैं। इस निर्णय को प्रभावित करने वाला प्रमुख कारक बाधित वेक्टर का स्थान है। चूंकि बाधित वेक्टर अक्सर कम मेमोरी में होता है, प्रोग्रामर आमतौर पर ऑपरेटिंग सिस्टम को कम मेमोरी में भी रखते हैं।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.