कर्नेल के व्यवहार को जांचने के लिए स्मृति के दौरान परीक्षण करने के लिए, मैं एक कर्नेल मॉड्यूल लिख रहा हूं जो लगातार स्मृति आवंटित करता है। कोडयह निर्धारित करने के लिए कि कोई लिनक्स कर्नेल मॉड्यूल स्मृति
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 में है। मेरे पास निम्नलिखित प्रश्न हैं
- मैं कैसे निर्धारित करूं कि कोड ने स्मृति को लीक किया है या नहीं? lsmod ज्यादा प्रकट नहीं करता है।
- इंटरनेट पर ट्यूटोरियल केवल init_module और exit_module में कोड दिखाते हैं। यदि मॉड्यूल डालने के बाद, लेकिन बाहर निकलने से पहले मैं समय की अवधि में स्मृति आवंटन करना चाहता हूं तो क्या होगा।
- क्या मेरे लिए कोड लिखना संभव है जो केवल स्मृति को लीक करता है जब उपयोगकर्ता ऐसा करने के लिए निर्देश देता है उदा। क्या उपयोगकर्ता स्पेस प्रोग्राम एक सिस्टम कॉल कर सकता है जो मॉड्यूल को स्मृति को रिसाव कर देगा?
पुनः 1: स्मृति रिसाव की परिभाषित संपत्ति यह है कि आवंटन कभी मुक्त नहीं होता है, यह आवश्यक नहीं है कि इसमें कोई संदर्भ न हो। इसके अलावा, 'var' संभवतः समय पर किसी बिंदु पर गुंजाइश से बाहर हो जाता है, जिस समय आपकी संदर्भ संख्या 0 पर जाती है। (आइए इस तथ्य को अनदेखा करें कि "संदर्भ" सी भाषा में अच्छी तरह से परिभाषित नहीं है।) – Karmastan
धन्यवाद। मैंने धागे की चमक के लिए कोड करने की कोशिश की लेकिन कोड काफी जटिल है http://www.scs.ch/~frey/linux/kernelthreads.html। क्या आप सिस्टम कॉल के बिना किसी उपयोगकर्ता स्पेस ईवेंट के माध्यम से स्मृति आवंटन को कैसे ट्रिगर कर सकते हैं, इस पर अंतर्दृष्टि प्रदान करने में सक्षम होंगे। – kakinada
केईडीआर 2.6.31 या नए कर्नेल संस्करणों का समर्थन करता है। मेरा 2.6.28 है। ऐसा लगता है कि केईडीआर का उपयोग नहीं किया जा सकता है। मैं कर्नेल के लिए समान टूल खोजने की कोशिश करूंगा कि मेरे पास – kakinada