我正在更新我的某个设备的驱动程序,并希望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中不存在该设备。 如何找出阻止我卸载驱动程序的实例?
答案 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)预先添加任何全局变量。