卸载仍然有实例的kext

Hed*_*dge 5 macos installer driver kernel-extension

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

安装后我尝试:

sudo kextunload /System/Library/Extensions/Driver.kext
Run Code Online (Sandbox Code Playgroud)

发生的错误如下所示:

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

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

The*_*ght 9

如果你调用命令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)预先添加任何全局变量.