7

我正在更新我的一台设备的驱动程序,并希望 kextunload 旧驱动程序并 kextload 新驱动程序,因此不再需要重新启动。

安装后我尝试:

sudo kextunload /System/Library/Extensions/Driver.kext

发生的错误如下所示:

(内核)无法卸载 kext com.driver.Driver;类有实例:(内核)Kext com.driver.Driver 类 com_driver_Driver_USBAudioDevice 有 1 个实例。无法卸载 com.driver.Driver - (libkern/kext) kext 正在使用或保留(无法卸载)。

ioreg 中不存在该设备。如何找出阻止我卸载驱动程序的实例是什么?

4

1 回答 1

12

如果您调用命令kextstat,它将显示所有已加载内核扩展的列表,其中包含如下信息:-

115 3 0xffffff7f814f4000 0x32000 0x32000 com.apple.iokit.IOAudioFamily (1.8.9fc11) <114 5 4 3 1>

第一个数字 (115) 是内核扩展的 id。

最后,一组数字 <114 5 4 3 1> 是这个特定 kext 引用的其他内核扩展 ID。

如果您将 kext 的 id 与另一个中列出的任何一个匹配,那么这就是 kextunload 所指的引用。

另请注意,在内核中编写任何代码时,全局变量在整个内核中都是全局的,因此,如果您声明了任何可能没有唯一名称并被另一个 kext 使用的变量,我发现这会导致类似的问题. 这里的解决方案是在任何全局变量前面加上一个反向公司 URI(例如 com_apple_globalVarName)。

于 2013-06-27T14:16:16.283 回答