2012-07-25 41 views
5

मैं एक डिवाइस ड्राइवर लिख रहा हूं कि, अन्य चीजों के साथ, स्मृति के ब्लॉक को kmalloc के साथ आवंटित करता है। जब उपयोगकर्ता प्रोग्राम फ़ाइल बंद करता है तो यह स्मृति मुक्त हो जाती है। मेरे प्रयोगों में से एक में, उपयोगकर्ता प्रोग्राम फ़ाइल को बंद किए बिना क्रैश हो गया।kmalloc() द्वारा आवंटित स्मृति को स्वचालित रूप से कभी भी मुक्त किया जाता है?

क्या इस स्मृति को कुछ भी मुक्त कर देगा?

एक अन्य प्रयोग में, मैंने close() फ़ंक्शन module_exit() फ़ंक्शन पर स्थानांतरित कर दिया। जब मैं लगातार दो बार उपयोगकर्ता प्रोग्राम चलाता हूं, तो मैंने पहले ही बिना किसी पॉइंटर के पहले kmalloc को उसी पॉइंटर के साथ बुलाया था। इस प्रकार, मैंने उस स्मृति में एक सूचक खो दिया, और इसे मुक्त नहीं कर सकता।

क्या यह स्मृति सिस्टम को तब तक खो गई जब तक कि मैं रीबूट नहीं करता, या जब मैं ड्राइवर को उतारता हूं तो इसे मुक्त किया जाएगा?

+2

यह शायद रीबूट लेगा। मुझे लगता है कि कर्नेल जादुई रूप से खोए हुए मेमोरी को मुक्त नहीं करेगा। ऐसा करने का सही तरीका प्रोग्राम से बाहर निकलने और मुक्त संसाधनों को हुक करना होगा। यह वही समय है जब एक प्रोग्राम की फाइल डिस्क्रिप्टर साफ हो जाते हैं। – Wug

उत्तर

8

कर्नेल मेमोरी स्वचालित रूप से कभी भी मुक्त नहीं होती है। इसमें kmalloc शामिल है।

फ़ाइल बंद होने पर एक खुली फ़ाइल डिस्क्रिप्टर से संबंधित सभी स्मृति जारी की जानी चाहिए।
जब कोई प्रक्रिया निकलती है, किसी भी कारण से (kill -9 सहित), सभी खुले फ़ाइल डिस्क्रिप्टर बंद होते हैं, और चालक के करीबी फ़ंक्शन को कॉल किया जाता है। तो यदि आप वहां मुक्त हैं, तो प्रक्रिया की प्रक्रिया के बाद मेमोरी रहने के लिए प्रक्रिया कुछ भी नहीं कर सकती है।

3

कृपया कर्नेल प्रोग्रामिंग के साथ अपने उपयोगकर्ता-स्पेस अनुभव से संबंधित न हों।

मेरा क्या मतलब है?

सामान्य प्रक्रियाओं को बाहर निकलने के बाद उनके लिए क्लीन-अप मिलता है, यह कर्नेल मॉड्यूल के मामले में नहीं है क्योंकि वे वास्तव में प्रक्रिया नहीं कर रहे हैं।

तकनीकी रूप से, जब आप मॉड्यूल लोड करते हैं और फिर kmalloc को कॉल करते हैं, तो आपने कर्नेल स्पेस में कर्नेल से आपके लिए कुछ मेमोरी आवंटित करने के लिए कहा था, यह तकनीकी रूप से पूरे कर्नेल के लिए एक नई मेमोरी है, भले ही आप अनलोड करें आपका मॉड्यूल, आवंटित कर्नेल मेमोरी तब तक स्पष्ट रूप से मुक्त होने तक है।

सरल शब्दों में आपके प्रश्न का उत्तर दें: प्रत्येक kmalloc को एक kfree की आवश्यकता होती है, अन्यथा स्मृति तब तक रहेगी जब तक सिस्टम चालू न हो।

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

  • कोई संबंधित समस्या नहीं^_^