Vmalloc और kmalloc में क्या अंतर है?


113

मैंने चारों ओर गुगली की है और पाया है कि अधिकांश लोग kmallocस्मृति के भौतिक भौतिक ब्लॉक प्राप्त करने की गारंटी देते हैं। हालाँकि, ऐसा भी लगता है कि kmallocयदि कोई सन्निहित भौतिक अवरोध जो आप चाहते हैं वह नहीं मिल सकता है।
स्मृति के एक सन्निहित ब्लॉक होने के क्या फायदे हैं? विशेष रूप से, मुझे सिस्टम कॉल में मेमोरी के एक आकस्मिक भौतिक ब्लॉक की आवश्यकता क्यों होगी ? क्या कोई कारण है जो मैं अभी उपयोग नहीं कर सका ? अंत में, अगर मुझे सिस्टम कॉल की हैंडलिंग के दौरान मेमोरी आवंटित करनी थी, तो क्या मुझे निर्दिष्ट करना चाहिए ? क्या एक सिस्टम कॉल को परमाणु संदर्भ में निष्पादित किया जाता है?vmalloc
GFP_ATOMIC

GFP_ATOMIC
आवंटन उच्च-प्राथमिकता है और नींद नहीं आती है। यह बाधा हैंडलर, निचले हिस्सों और अन्य स्थितियों में उपयोग करने का झंडा है जहां आप सो नहीं सकते हैं।

GFP_KERNEL यह एक सामान्य आवंटन है और ब्लॉक हो सकता है। यह प्रक्रिया संदर्भ कोड में उपयोग करने वाला झंडा है जब यह सोने के लिए सुरक्षित है।


Vmalloc और kmalloc पर एक अच्छा लेख http://learnlinuxconcepts.blogspot.in/2014/02/linux-memory-management.html
JIN007

4
यह लेख इस तरह के बकवास का दावा करता है: "आम तौर पर एक 32 बिट आर्किटेक्चर में 4KB पेज साइज होता है और 64 बिट आर्किटेक्चर में 8KB पेज साइज होता है"। मैंने इसे पूरी तरह से नहीं पढ़ा है, लेकिन मैं इसे "अच्छा" नहीं कहूंगा, या यहां तक ​​कि इसके एक शब्द पर भी भरोसा नहीं कर सकता।
अलेक्जेंड्रो सान्चेज़

1
नोट (अर्ध-संबंधी): vmallocकर्नेल 5.2 (Q2 2019) के साथ तेज़ है
VonC

जवाबों:


96

आपको केवल भौतिक रूप से सन्निहित मेमोरी का उपयोग करने के बारे में चिंता करने की आवश्यकता है यदि बफर को भौतिक रूप से संबोधित बस (जैसे पीसीआई) पर डीएमए डिवाइस द्वारा एक्सेस किया जाएगा। परेशानी यह है कि कई सिस्टम कॉल्स को यह जानने का कोई तरीका नहीं है कि क्या उनके बफर को अंततः डीएमए डिवाइस में पारित किया जाएगा: एक बार जब आप किसी अन्य कर्नेल सबसिस्टम को बफर पास करते हैं, तो आप वास्तव में नहीं जान सकते कि यह कहां जा रहा है। भले ही कर्नेल आज डीएमए के लिए बफर का उपयोग नहीं करता है, भविष्य का विकास ऐसा कर सकता है।

vmalloc अक्सर kmalloc की तुलना में धीमी होती है, क्योंकि इसमें बफर स्पेस को वस्तुतः सन्निहित सीमा में फिर से भरना पड़ सकता है। kmalloc कभी नहीं रुकता है, अगर GFP_ATOMIC kmalloc के साथ नहीं बुलाया जा सकता है।

kmalloc यह प्रदान कर सकते हैं बफर के आकार में सीमित है: 128 KBytes *) । यदि आपको वास्तव में एक बड़े बफर की आवश्यकता है, तो आपको vmalloc या कुछ अन्य तंत्र का उपयोग करना होगा जैसे कि बूट पर उच्च मेमोरी को स्टोर करना।

*) यह पहले की गुठली का सच था। हाल की गुठली पर (मैंने इसे 2.6.33.2 पर परीक्षण किया), एक एकल kmalloc का अधिकतम आकार 4 एमबी तक है! (मैंने इस पर काफी विस्तृत पोस्ट लिखा है ।) - काईवान

एक सिस्टम कॉल के लिए आपको GFP_ATOMIC को kmalloc () पास करने की आवश्यकता नहीं है, आप GFP_KERNEL का उपयोग कर सकते हैं। आप एक बाधा हैंडलर नहीं हैं: एप्लिकेशन कोड एक जाल के माध्यम से कर्नेल संदर्भ में प्रवेश करता है, यह एक बाधा नहीं है।


1
मैंने सोचा कि $ 0x80 को ट्रिगर करके सिस्टम कॉल दर्ज किए गए थे? (अर्थात एक व्यवधान)?
FreeMemory

2
int $ 0x80 एक सॉफ्टवेयर इंटरप्ट है, जिसे ट्रैप भी कहा जाता है। इंटरप्ट हैंडलर का मतलब हार्डवेयर इंटरप्ट होता है, जैसे कि जब यूजर किसी की को दबाता है या मूव करता है।
ब्रानन

सिस्टम कॉल यूजर्सस्पेस के लिए कर्नेल स्पेस ट्रांज़िशन के लिए हैं ... किमीलाक का उपयोग कर्नेल संदर्भ में ही किया जाता है ??
AIB

3
@FreeMemory: int $ 0x80 x86- विशिष्ट है, और फिर, यह एक पुराना तरीका भी है जो sysenter / syscall (x86 पर) द्वारा दिया गया है।
जोर्जेंसन

18

संक्षिप्त उत्तर: लिनक्स डिवाइस ड्राइवर डाउनलोड करें और मेमोरी प्रबंधन पर अध्याय पढ़ें।

गंभीरता से, कर्नेल मेमोरी प्रबंधन से संबंधित बहुत सारे सूक्ष्म मुद्दे हैं जिन्हें आपको समझने की आवश्यकता है - मैं अपना बहुत समय डिबगिंग समस्याओं के साथ बिताता हूं।

vmalloc () का उपयोग बहुत कम किया जाता है, क्योंकि कर्नेल शायद ही कभी वर्चुअल मेमोरी का उपयोग करता है। kmalloc () वह है जो आमतौर पर उपयोग किया जाता है, लेकिन आपको यह जानना होगा कि अलग-अलग झंडे के परिणाम क्या हैं और असफल होने पर क्या होता है, इससे निपटने के लिए आपको एक रणनीति की आवश्यकता है - खासकर यदि आप एक बाधा हैंडलर में हैं, जैसे आपने सुझाव दिया था।


1
"क्योंकि कर्नेल शायद ही कभी वर्चुअल मेमोरी का उपयोग करता है", हालांकि ऐसा क्यों है?
ट्रे

क्योंकि आप आमतौर पर कर्नेल ब्लॉक नहीं चाहते हैं, जबकि यह कर्नेल को डिस्क स्टोरेज में या उसके बाहर मेमोरी स्वैप करने के लिए इंतजार करता है ...
माइक हेंज

नहीं, vmalloc के साथ आवंटित कर्नेल मेमोरी कभी स्वैप नहीं होती है । केवल यूजरस्पेस मेमोरी को स्वैप किया जा सकता है। कर्नेल पता स्थान अस्वाभाविक है, और vmalloc कर्नेल के पता स्थान में आवंटित करता है।
user2679859

13

रॉबर्ट प्यार द्वारा लिनक्स कर्नेल विकास (अध्याय 12, पृष्ठ 244 तीसरे संस्करण में) यह बहुत स्पष्ट रूप से उत्तर देता है।

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

इस बफर को एक्सेस करते समय टीएलबी (हाल की वर्चुअल टू फिजिकल एड्रेस मैपिंग को संग्रहीत करने वाली कैश प्रविष्टियाँ) पर भी दबाव डालता है। इससे थ्रैशिंग हो सकती है ।


11

kmalloc()और vmalloc()कार्यों बाइट आकार मात्रा में कर्नेल स्मृति प्राप्त करने के लिए एक सरल अंतरफलक है।

  1. kmalloc()समारोह की गारंटी देता है कि पृष्ठों शारीरिक रूप से सन्निहित (और लगभग सन्निहित) कर रहे हैं।

  2. vmalloc()कार्य करने के लिए इसी तरह से काम करता है kmalloc(), आबंटित करता स्मृति है कि केवल लगभग सन्निहित और जरूरी शारीरिक रूप से सन्निहित नहीं है, यह छोड़कर।


4

स्मृति के एक सन्निहित ब्लॉक होने के क्या फायदे हैं? विशेष रूप से, मुझे सिस्टम कॉल में मेमोरी के एक आकस्मिक भौतिक ब्लॉक की आवश्यकता क्यों होगी? क्या कोई कारण है कि मैं सिर्फ vmalloc का उपयोग नहीं कर सका?

Google की "आई एम फीलिंग लकी" से vmalloc:

kmalloc पसंदीदा तरीका है, जब तक आपको बहुत बड़े क्षेत्रों की आवश्यकता नहीं है। परेशानी यह है, यदि आप डीएमए / कुछ हार्डवेयर डिवाइस से करना चाहते हैं, तो आपको kmalloc का उपयोग करने की आवश्यकता होगी, और आपको संभवतः बड़े रद्दी की आवश्यकता होगी। समाधान यह है कि जितनी जल्दी हो सके, स्मृति को आवंटित किया जाए, इससे पहले कि मेमोरी खंडित हो जाए।


देखिए, मैंने पढ़ा है कि, और यह मेरे लिए समझ में नहीं आता है। मैं समझता हूं कि बड़े क्षेत्रों के लिए kmalloc का उपयोग करना ; लेकिन छोटे आवंटन के लिए, भौतिक स्मृति को खंडित करने से बचने के लिए vmalloc का उपयोग क्यों नहीं किया जाता है?
FreeMemory

क्योंकि आपको उस कर्नेल पर भरोसा करना चाहिए जो सबसे अच्छा है; अगर यह सोचता है कि एक ही हिस्सा आवंटित करना बेहतर है, तो वह ऐसा करेगा। vmalloc केवल तब के लिए है जब आपके पास बिल्कुल एक सन्निहित हिस्सा होना चाहिए
डार्क शिकारी

मुझे लगता है कि समझ में आता है, लेकिन यह उल्टा लगता है। kmalloc की तरह लगता है कि इसका इस्तेमाल तब किया जाना चाहिए जब प्रदर्शन अत्यंत चिंता का विषय हो (अर्थात मुझे डिस्क IO से ग्रस्त नहीं किया जा सकता)। इसके अलावा, GFP_ATOMIC के बारे में क्या?
FreeMemory

2

32-बिट सिस्टम पर, kmalloc () कर्नेल लॉजिकल एड्रेस (इसका एक वर्चुअल पता हालांकि) देता है जिसमें प्रत्यक्ष मैपिंग (वास्तव में निरंतर ऑफसेट के साथ) भौतिक पते पर होती है। यह प्रत्यक्ष मानचित्रण यह सुनिश्चित करता है कि हमें रैम का एक सन्निहित भौतिक हिस्सा मिल जाए। डीएमए के लिए उपयुक्त जहां हम केवल प्रारंभिक सूचक देते हैं और हमारे ऑपरेशन के लिए एक सन्निहित भौतिक मानचित्रण की अपेक्षा करते हैं।

vmalloc () कर्नेल आभासी पता देता है जो बदले में भौतिक रैम पर एक सन्निहित मानचित्रण नहीं हो सकता है। बड़े मेमोरी आवंटन के लिए उपयोगी और ऐसे मामलों में जहां हम इस बात की परवाह नहीं करते हैं कि हमारी प्रक्रिया को आवंटित मेमोरी फिजिकल रैम में भी निरंतर है।


1

अन्य अंतरों में से एक है kmalloc तार्किक पता लौटाएगा (अन्यथा आप GPF_HIGHMEM निर्दिष्ट करें)। तार्किक पते "कम मेमोरी" (भौतिक मेमोरी के पहले गीगाबाइट में) में रखे जाते हैं और भौतिक पते पर सीधे मैप किए जाते हैं (इसे बदलने के लिए __pa मैक्रो का उपयोग करें)। इस संपत्ति का तात्पर्य kmalloced memory निरंतर मेमोरी है।

दूसरे हाथ में, Vmalloc "उच्च मेमोरी" से आभासी पते वापस करने में सक्षम है। इन पतों को प्रत्यक्ष पते में भौतिक पते में परिवर्तित नहीं किया जा सकता है (आपको virt_to_page फ़ंक्शन का उपयोग करना होगा)।

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