2011-05-06 7 views
9

कर्नेल के व्यवहार को जांचने के लिए स्मृति के दौरान परीक्षण करने के लिए, मैं एक कर्नेल मॉड्यूल लिख रहा हूं जो लगातार स्मृति आवंटित करता है। कोडयह निर्धारित करने के लिए कि कोई लिनक्स कर्नेल मॉड्यूल स्मृति

int bytesLeaked = 128000; 
char *var = kmalloc(bytesLeaked, GFP_KERNEL); 
if (var != NULL) 
printk("leaked %d bytes at address %x\n", bytesLeaked, (unsigned int)var); 

यह कोड init_module में है। मेरे पास निम्नलिखित प्रश्न हैं

  1. मैं कैसे निर्धारित करूं कि कोड ने स्मृति को लीक किया है या नहीं? lsmod ज्यादा प्रकट नहीं करता है।
  2. इंटरनेट पर ट्यूटोरियल केवल init_module और exit_module में कोड दिखाते हैं। यदि मॉड्यूल डालने के बाद, लेकिन बाहर निकलने से पहले मैं समय की अवधि में स्मृति आवंटन करना चाहता हूं तो क्या होगा।
  3. क्या मेरे लिए कोड लिखना संभव है जो केवल स्मृति को लीक करता है जब उपयोगकर्ता ऐसा करने के लिए निर्देश देता है उदा। क्या उपयोगकर्ता स्पेस प्रोग्राम एक सिस्टम कॉल कर सकता है जो मॉड्यूल को स्मृति को रिसाव कर देगा?

उत्तर

0
  1. कोड स्मृति लीक जब यह (kmalloc() साथ बताया गया है) स्मृति का एक ब्लॉक आवंटित करता है और फिर कभी यह पहली मुक्त कराने के बिना स्मृति की है कि ब्लॉक के सभी संदर्भ खो देता है। आपके कोड ने ऐसा नहीं किया है, क्योंकि आपके पास अभी भी var दायरे में है और आपके स्मृति के ब्लॉक को इंगित करता है। यदि आप अगली पंक्ति पर var = NULL; जोड़ते हैं, तो आपके पास एक विस्तृत स्मृति रिसाव है।

  2. और यह होना बिल्कुल संभव है ताकि उपयोगकर्ता-स्थान में कोई ईवेंट आपके कर्नेल मॉड्यूल को स्मृति आवंटित करने के लिए ट्रिगर करता है। मुझे यकीन नहीं है कि क्या आप इसे सिस्टम कॉल के माध्यम से सीधे कर सकते हैं, लेकिन यदि आप नहीं कर सकते हैं तो कार्य को पूरा करने के कई अन्य तरीके हैं। आपको बस एक को चुनने और इसे लागू करने की आवश्यकता है। प्रत्येक बार जब आप स्मृति आवंटन को ट्रिगर करना चाहते हैं, तो पूर्व निर्धारित फ़ाइल होने के साथ ही touch भी काम करना चाहिए। हालांकि मुझे नहीं लगता कि आपके पास init_module कोड क्यों नहीं हो सकता है, जो थ्रेड को थ्रेड करता है जो समय के साथ समय-समय पर स्मृति आवंटित करता है, यदि वह व्यवहार आप चाहते हैं।

+4

पुनः 1: स्मृति रिसाव की परिभाषित संपत्ति यह है कि आवंटन कभी मुक्त नहीं होता है, यह आवश्यक नहीं है कि इसमें कोई संदर्भ न हो। इसके अलावा, 'var' संभवतः समय पर किसी बिंदु पर गुंजाइश से बाहर हो जाता है, जिस समय आपकी संदर्भ संख्या 0 पर जाती है। (आइए इस तथ्य को अनदेखा करें कि "संदर्भ" सी भाषा में अच्छी तरह से परिभाषित नहीं है।) – Karmastan

+0

धन्यवाद। मैंने धागे की चमक के लिए कोड करने की कोशिश की लेकिन कोड काफी जटिल है http://www.scs.ch/~frey/linux/kernelthreads.html। क्या आप सिस्टम कॉल के बिना किसी उपयोगकर्ता स्पेस ईवेंट के माध्यम से स्मृति आवंटन को कैसे ट्रिगर कर सकते हैं, इस पर अंतर्दृष्टि प्रदान करने में सक्षम होंगे। – kakinada

+0

केईडीआर 2.6.31 या नए कर्नेल संस्करणों का समर्थन करता है। मेरा 2.6.28 है। ऐसा लगता है कि केईडीआर का उपयोग नहीं किया जा सकता है। मैं कर्नेल के लिए समान टूल खोजने की कोशिश करूंगा कि मेरे पास – kakinada

18

आप की जाँच करने के लिए यदि एक कर्नेल मॉड्यूल स्मृति लीक किया गया है और अपनी मशीन 86 आर्किटेक्चर है की जरूरत है, तो आप KEDR system उपयोग कर सकते हैं, यह एक स्मृति रिसाव डिटेक्टर भी शामिल है।

केईडीआर आपको कर्नेल को पुनर्निर्माण करने की आवश्यकता नहीं है। ऑनलाइन दस्तावेज़ (उदाहरण के लिए, "प्रारंभ करना" देखें) वर्णन करें कि KEDR को कैसे इंस्टॉल करें और उपयोग करें। संक्षेप में, प्रक्रिया निम्नानुसार है।

(स्रोत से) अधिष्ठापन: अनटार स्रोत संग्रह - cmake < ...> - बनाने -

प्रारंभ Kedr स्थापित करने से पहले आप अपने मॉड्यूल लोड करने के:

$ kedr start <name_of_the_module_to_analyze> -f leak_check.conf 

तो फिर आप अपने मॉड्यूल लोड कर सकते हैं और सामान्य रूप से इसके साथ काम करते हैं।

$ cat /sys/kernel/debug/kedr_leak_check/info 
Target module: "...", 
Memory allocations: 3 
Possible leaks: 2 
Unallocated frees: 0 

फ़ाइल possible_leaks/sys/kernel/debug/kedr_leak_check/ से जानकारी (पता, आकार, कॉल स्टैक) प्रदान करता है प्रत्येक लीक के बारे में: आप इसे अनलोड करने के बाद, Kedr आप debugfs में एक रिपोर्ट (आमतौर पर debugfs /sys/kernel/debug को रखा जाता है), उदाहरण के लिए दे देंगे मेमोरी ब्लॉक

अंत में, आप Kedr (ध्यान दें कि /sys/kernel/debug/kedr_leak_check/ गायब हो जाएगा) बंद कर सकते हैं:

kedr stop 

आप 86 के अलावा अन्य वास्तुकला के साथ एक प्रणाली का उपयोग कर रहे हैं, Kmemleak भी सहायक हो सकता है, हालांकि यह थोड़ा अधिक के लिए मुश्किल है उपयोग। आपको शायद कर्नेल को CONFIG_DEBUG_KMEMLEAK पैरामीटर के साथ 'y' पर सेट करने की आवश्यकता होगी। फिर भी, Kmemleak भी एक बहुत उपयोगी उपकरण है। विवरण के लिए कर्नेल स्रोतों में Documentation/kmemleak.txt देखें।

+2

है KEDR 2.6.31 या नए कर्नेल संस्करणों का समर्थन करता है। मेरा 2.6.28 है। ऐसा लगता है कि केईडीआर का उपयोग नहीं किया जा सकता है। मैं अपने पास कर्नेल के लिए समान टूल खोजने की कोशिश करूंगा – kakinada

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