2010-05-22 11 views
8

जब मैं कर्नेल मॉड्यूल में malloc का उपयोग करने का प्रयास करता हूं तो मुझे कंपाइलर से एक त्रुटि संदेश मिलता है। मेरे कोड:कर्नेल में malloc

res=(ListNode*)malloc(sizeof(ListNode)); 

compilers त्रुटि संदेश है:

/root/ex3/ex3mod.c:491: error: implicit declaration of function ‘malloc’ 

मुझे क्या करना चाहिए?

+0

दूसरे शब्दों में हम सभी जानते हैं # शामिल कर्नेल में मौजूद नहीं है जिसमें मुझे क्या शामिल होना चाहिए? – yoavstr

उत्तर

19

उपयोग kmalloc या vmalloc बजाय (यह भी this देखें)

+1

या 'vmalloc()'। मेमोरी आवंटन कर्नेल में अलग-अलग काम करता है। – Wyzard

+0

वाईज़ार्ड, धन्यवाद। – knittl

+2

ये लिंक मर चुके हैं; एकमात्र उदाहरण क्यों लिंक केवल जवाब एक बुरा विचार है। यह उत्तर Google खोज के शीर्ष पर है "क्या मैं कर्नेल मॉड्यूल में malloc का उपयोग कर सकता हूं?"। –

7

आप कर्नेल में पुस्तकालयों का उपयोग नहीं कर सकते। कोई भी नहीं, कुछ भी नहीं।

इसका मतलब है कि कर्नेल में जो भी फ़ंक्शन आप कॉल कर रहे हैं उसे कर्नेल में परिभाषित करने की आवश्यकता है। लिनक्स एक मॉलोक को परिभाषित नहीं करता है, इसलिए आप इसका उपयोग नहीं कर सकते हैं।

मेमोरी आवंटक और स्मृति आवंटन कार्यों का एक परिवार है। अधिक जानकारी के लिए मेमोरी आवंटक पर कर्नेल दस्तावेज़ पढ़ें।

गोपनीय रूप से, कर्नेल परिभाषित कुछ फ़ंक्शन हैं जो मानक सी लाइब्रेरी में भी हैं; यह सुविधा के लिए है।

यह करता है, उदाहरण के लिए, snprintf

1

उपयोग kmalloc/kfree परिभाषित किया। आप कर्नेल स्रोत कोड में malloc galloc हो सकता है। दो आवंटन विधियों के बीच अंतर के बारे में

14

नोट - kmalloc और kmem_cache, या vmalloc:

kmalloc: सर्वश्रेष्ठ तेज आवंटन है कि एक पृष्ठ से छोटे हैं के लिए इस्तेमाल किया (PAGE_SIZE, 0x1000 सबसे आर्किटेक्चर पर)। इसमें मैपिंग मेमोरी शामिल नहीं है, इसलिए आपको कर्नेल की 1: 1 भौतिक मेमोरी मैपिंग से सीधे मेमोरी मिलती है। आपको शारीरिक रूप से आकस्मिक स्मृति मिलती है। ध्यान दें कि यदि आप से अधिक एक पृष्ठ (यानी आदेश> 0) आवंटित करना चाहते हैं, तो आप बाहरी विखंडन के मुद्दों में बंपिंग का जोखिम उठाने का जोखिम उठाते हैं - यानी कॉल पर्याप्त विफल होने पर भी असफल हो सकता है। उच्च आदेश - आवंटन विफलता के लिए उच्च अवसर, और अप-टाइम यहां भी एक कारक निभाता है।

यदि आप अधिकतम आवंटन दक्षता प्राप्त करना चाहते हैं तो प्रत्येक प्रकार की संरचना के लिए अपने स्वयं के kmem_cache का उपयोग करने का तरीका है (इस रणनीति के लिए अन्य लाभ/आवंटन से आपकी आवंटन की स्थिति की निगरानी करने और स्मृति को पकड़ने में सक्षम हैं अधिक आसानी से लीक)।

vmalloc: एक से अधिक पृष्ठों के आवंटन। आपको कर्नेल स्पेस में मैप-मेमोरी मिलती है। दृश्यों के पीछे यह उपयोगकर्ता के समान होने के समान है - कर्नेल पृष्ठों का एक समूह आवंटित करता है और उन्हें वर्चुअल एड्रेस स्पेस में मानचित्र करता है। यह आवंटन kmalloc की तुलना में धीमा है, और स्मृति पहुंच थोड़ा अधिक ओवरहेड हो सकती है।

0

आप इसे एक तीन चरण की प्रक्रिया की तरह कल्पना कर सकते हैं:

  1. उपयोगकर्ता अंतरिक्ष पुस्तकालय - malloc()

  2. सिस्टम कॉल - नि:()

  3. अंदर कर्नेल - kmalloc/vmalloc/gfp आदि मेमोरी मैनेजर की दिनचर्या

तो यदि आप चरण 3 पर पहले से ही हैं, तो कर्नेल मॉड्यूल लिखना, फिर वापस जाना समझ में नहीं आता है। तो आपको केवल स्मृति आवंटन के लिए कर्नेल रूटीन का उपयोग करने की आवश्यकता है।