मैं एक ऑडियो डिवाइस ड्राइवर के लिए एक ओएसएक्स कर्नेल एक्सटेंशन लिख रहा हूं (यह सॉफ्टवेयर है, लेकिन हार्डवेयर डिवाइस का अनुकरण करता है)।कर्नेल एक्सटेंशन को अनलोड नहीं कर सकता; कक्षाओं के उदाहरण हैं
विकास के दौरान, मौजूदा पुराने संस्करणों को पूरी तरह से अनइंस्टॉल करना और फिर स्क्रैच से नया संस्करण बनाना और स्थापित करना सुविधाजनक होगा। हालांकि, यह कभी-कभी सिस्टम को पुनरारंभ किए बिना संभव नहीं लगता है।
प्रोग्राम स्वयं नहीं चल रहा है और स्रोत फ़ाइलों को /System/Library/Extensions/
dir से हटा दिया गया है।
$ kextstat | grep 'com.foo.driver.bar'
219 0 0xfff123 0x5000 0x5000 com.foo.driver.bar (0.0.1) <102 5 4 3>
(... जिसका अर्थ है :)
Index Refs Address Size Wired Name (Version) <Linked Against>
तो वहाँ मेरे ड्राइवर उदाहरण के लिए 0 Refs, लेकिन kextunload
कभी कभी असफल हो जायेगी, की शिकायत कर रहे हैं:
लेकिन kextstat
एक उदाहरण से पता चलता है मौजूदा उदाहरण:
$ sudo kextunload -b com.foo.driver.bar
(kernel) Can't unload kext com.foo.driver.bar; classes have instances:
(kernel) Kext com.foo.driver.bar class FooBarDriver has 1 instance.
(kernel) Kext com.foo.driver.bar class com_foo_driver_bar has 1 instance.
Failed to unload com.foo.driver.bar - (libkern/kext) kext is in use or retained (cannot unload).
जब ऐसा होता है, वें Kext को अनलोड करने के लिए "बल" करने का कोई तरीका नहीं है (जिसे मैं जानता हूं)।
क्या मैं यह अनुमान लगाने में सही हूं कि यह एकल उदाहरण अभी भी चल रहा ओएस कर्नेल द्वारा स्मृति में किए गए संदर्भ के कारण मौजूद है? यह सही प्रतीत नहीं होता है, क्योंकि kextunload
हमेशा असफल रहता है। तो kextunload
क्यों कभी-कभी सिस्टम को सभी ड्राइवर उदाहरणों को "पूरी तरह से" अनलोड करने के लिए पुनरारंभ करने की आवश्यकता होती है?
सहायक। धन्यवाद! – pje