卸载仍然有实例的kext

时间:2013-06-27 14:01:37

标签: macos installer driver kernel-extension

我正在更新我的某个设备的驱动程序,并希望kextunload旧驱动程序并加载新驱动程序,因此不再需要重新启动。

安装完成后我尝试:

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中不存在该设备。 如何找出阻止我卸载驱动程序的实例?

1 个答案:

答案 0 :(得分:8)

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

  

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

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

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

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

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