【问题标题】:Unload kext which still has instances卸载仍然有实例的 kext
【发布时间】:2013-06-25 01:57:43
【问题描述】:

我正在更新我的一台设备的驱动程序,并希望 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 中不存在。 如何找出阻止我卸载驱动程序的实例是什么?

【问题讨论】:

    标签: macos installation driver kernel-extension


    【解决方案1】:

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

    115 3 0xffffff7f814f4000 0x32000 0x32000 com.apple.iokit.IOAudioFamily (1.8.9fc11)

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

    最后,一组数字 是此特定 kext 引用的其他内核扩展 ID。

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

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

    【讨论】:

    • 所以我还需要卸载所有引用的内核扩展。
    • 根据我的经验,我会说您需要这样做,因为我不知道有任何其他方法可以解决它。如果您犯了非唯一全局变量的错误,我建议您简单地重置机器,因为您不太可能知道是哪个其他 kext 导致了问题。
    • 不是我的驱动,我也改不了。
    • 啊,我还以为你给它贴上了“MyDriver.kext”的标签!
    • 我在帖子中更改了它以消除一些混乱。对此感到抱歉。
    猜你喜欢
    • 1970-01-01
    • 2014-10-20
    • 2020-11-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-11
    • 2011-07-18
    • 2023-01-14
    • 1970-01-01
    相关资源
    最近更新 更多