卸载仍具有实例的kext

9

我正在更新一个设备的驱动程序,并想要kextunload旧驱动程序并kextload新驱动程序,这样就不需要重新启动了。

安装后,我尝试执行以下操作:

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

发生的错误如下所示:

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

该设备在ioreg中不存在。我该如何找到阻止我卸载驱动程序的实例呢?
2个回答

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 与另一个 listed 中的任何相匹配,则 kextunload 引用的就是那个引用。
还要注意,在内核中编写任何代码时,全局变量在整个内核中是全局的,因此,如果你声明了任何可能没有唯一名称并且被另一个 kext 使用的全局变量,我发现这会导致类似的问题。解决方法在这里是使用反向公司 URI(例如com_apple_globalVarName)为任何全局变量添加前缀。

所以我需要卸载所有引用的内核扩展。 - Hedge
从我的经验来看,我认为你需要这样做,因为我不知道修复它的其他方法。如果你犯了全局变量不唯一的错误,我建议你简单地重置机器,因为你很难知道哪个其他的内核扩展正在引起问题。 - TheDarkKnight
1
这不是我的驱动程序,我也无法更改它。 - Hedge
啊,我以为你把它标记为“MyDriver.kext”了! - TheDarkKnight
我在帖子中进行了修改,以消除一些混淆。对此我感到抱歉。 - Hedge
这个答案事实上是不正确的,正如kextstat手册条目所示,ref字段表示有多少其他kext引用了这个kext。<Linked Against>列表是这个kext所引用的kexts。我在下面添加了一个更正确和更详细的答案。 - Brett Lykins

4
接受的答案是不正确的。从 kextstat 输出的末尾数字不是列出依赖于此驱动程序的内核扩展。
它们是此内核扩展所依赖的内核扩展的列表。
使用与其他答案相同的内核扩展示例 com.apple.iokit.IOAudioFamily,我显示如下:
~ root# kmutil showloaded -b com.apple.iokit.IOAudioFamily
No variant specified, falling back to release
Index Refs Address            Size       Wired      Name (Version) UUID <Linked Against>
  152    3 0xffffff7f9922c000 0x1e000    0x1e000    com.apple.iokit.IOAudioFamily (340.2) 2BC68A45-C1C1-30D1-A7A2-B911CFDB04F2 <151 7 6 3 1>
Note: 我使用 kmutil showloaded 而不是 kextstat,因为后者已被弃用。

将此输出分解,我们可以看到:

  • Refs计数为3,表示有3个其他的kext引用(或链接)了这个kext。
  • <Linked Against>列表显示了此kext所依赖的其他kext的Index

要具体回答您的问题,您需要查找在其<Linked Against>列表中列出您的kext的Index的其他kext。

继续我们对com.apple.iokit.IOAudioFamily kext的示例,我们可以查看所有已加载的kext,并搜索任何引用index 152的内容,方法是运行:kmutil showloaded | grep '<.*152.*>'

~ root# kmutil showloaded | grep '<.*152.*>'
No variant specified, falling back to release
  153    0 0xffffff7f99023000 0x52000    0x52000    com.apple.driver.AppleUSBAudio (416.2) D9A996CC-8118-3E85-B019-F756AC2A4689 <152 150 114 24 23 16 8 7 6 3 1>
  190    0 0xffffff7f97a97000 0x5f000    0x5f000    com.apple.driver.AppleGFXHDA (140.3) EED41AF8-3465-37CC-AB65-DB85BD71B595 <152 144 134 16 9 8 7 6 3 1>
  219    0 0xffffff7f990ad000 0x3000     0x3000     com.apple.driver.AudioAUUC (1.70) 5C4939F8-12C1-39BF-AD87-8456A450BCF7 <152 134 16 15 9 7 6 3 1>

正如您所看到的,引用(或链接到)com.apple.iokit.IOAudioFamily 的三个内核扩展是:

  • com.apple.driver.AppleUSBAudio
  • com.apple.driver.AppleGFXHDA
  • com.apple.driver.AudioAUUC

在卸载原始内核扩展之前,您需要卸载这三个内核扩展(以及它们反过来引用的任何内核扩展)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接