我正在为音频设备驱动程序编写OSX内核扩展(它是软件,但模拟硬件设备)。
在开发过程中,完全卸载现有的旧版本,然后从头构建和安装新版本会很方便。然而,这有时似乎不可能在不重新启动系统的情况下完成。
程序本身没有运行,并且源文件已从 /System/Library/Extensions/ 目录中删除。
但是 kextstat 显示了一个实例:
当发生这种情况时,我不知道有什么方法可以“强制”卸载kext。 我猜想,这个单一实例之所以仍然存在,是因为运行中的操作系统内核中保存了对它的引用吗?但这似乎不正确,因为那样的话,kextunload 将总是失败。那么,为什么 kextunload 只有在有时需要系统重启才能“完全”卸载所有驱动程序实例呢?
在开发过程中,完全卸载现有的旧版本,然后从头构建和安装新版本会很方便。然而,这有时似乎不可能在不重新启动系统的情况下完成。
程序本身没有运行,并且源文件已从 /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>
(...meaning:)
Index Refs Address Size Wired Name (Version) <Linked Against>
所以我的驱动程序实例没有引用,但是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).
当发生这种情况时,我不知道有什么方法可以“强制”卸载kext。 我猜想,这个单一实例之所以仍然存在,是因为运行中的操作系统内核中保存了对它的引用吗?但这似乎不正确,因为那样的话,kextunload 将总是失败。那么,为什么 kextunload 只有在有时需要系统重启才能“完全”卸载所有驱动程序实例呢?