2011-10-05 22 views
16

इस स्थिति को दूर करने के हमेशा मुझे परेशान:कैसे एक असफल कर्नेल मॉड्यूल

मैं एक कर्नेल मॉड्यूल लिखा है, और कभी कभी यह एक बग (एक NULL संकेतक भिन्नता) है। मैं hello.ko insmod के बाद, यह कुछ कर्नेल त्रुटियों को दिखाता है। फिर मैं कोड बदलता हूं, और मॉड्यूल को हटाने और इसे फिर से स्थापित करने का प्रयास करता हूं। सवाल यह है: मुझे नहीं पता कि कर्नेल मॉड्यूल को कैसे हटाया जाए।

$ rmmod hello

ERROR: module hello in use

$ rmmod -f hello

ERROR: removing hello: device or resource busy

मैं हमेशा मॉड्यूल को हटाने के लिए मशीन को रीबूट करता हूं, जो बहुत लंबा लगता है। क्या इसके लिए किसी के पास बेहतर समाधान है? किसी भी इनपुट के लिए धन्यवाद।

उत्तर

10

वर्चुअल मशीन का उपयोग करें।

एक बार जब आप एक पूर्ण अव्यवस्था या ऐसी अन्य गलती करते हैं, तो आपने कर्नेल को अज्ञात स्थिति में डाल दिया है। यहां तक ​​कि यदि आपने मॉड्यूल को हटाने का प्रबंधन किया है (जो संभव होने की संभावना नहीं है; कर्नेल ओओपीएस कॉलिंग थ्रेड को मारता है, इसलिए इसे संदर्भ गणना को कम करने का मौका कभी नहीं मिलेगा - मॉड्यूल कभी भी हटाने योग्य नहीं होगा) अभी भी हो सकता है भ्रष्टाचार पीछे छोड़ दिया गया है, और आपका नया, 'निश्चित' मॉड्यूल बस मुसीबत में होने की संभावना है।

बस एक स्नैपशॉट के साथ, एक तेज़-से-रीबूट वर्चुअल मशीन का उपयोग करना बेहतर है - बहाली को और भी तेज बनाने के लिए।

2

जैसा कि बोडनान ने बताया, आप वर्चुअल मशीन से बेहतर होंगे।

  1. जांच अपने कर्नेल config CONFIG_MODULE_FORCE_UNLOAD सक्षम
  2. एक और मॉड्यूल है कि टूटी हुई मॉड्यूल के refcount सेट लिखना है:

    हालांकि, अगर आप वास्तव में इसे अपने तरीके से करना चाहते हैं, आप के लिए है शून्य करने के लिए। delete_module सिस्टम कॉल kernel/module.c

में सिस्टम कॉल देखें
संबंधित मुद्दे