我正在为音频设备驱动程序(它是软件,但模拟硬件设备)编写OSX内核扩展。无法卸载内核扩展;类有实例
在开发过程中,完全卸载现有的旧版本然后从头开始构建和安装新版本会很方便。但是,如果没有系统重启,偶尔会出现这种情况。
程序本身未运行,源文件已从/System/Library/Extensions/
目录中删除。
但kextstat
揭示了一个实例:
$ 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至参考文献我的司机实例,但有时kextunload
会失败,抱怨现有实例:
$ 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).
发生这种情况时, ere无法“强制”卸载kext(我知道)。
我是否正确地猜测这个单一实例仍然存在,因为运行的操作系统内核在内存中保存了一个引用?这看起来不正确,因为然后kextunload
总是会失败。那么为什么kextunload
只有时需要系统重启才能“完全”卸载所有驱动程序实例?
有帮助。谢谢! – pje