在早期启动过程中加载 OS X kext

Load OS X kext in the early boot process

我有一个可用的 OSX 内核扩展,我希望它能在启动时尽早自动加载。 kext 使用 KAUTH 来监控特定路径上的访问,所以在我看来,不会有任何请求将其加载到内核中。在这种情况下,将其复制到 /Library/Extensions(至少因为 Yosemite 这是第三方扩展的推荐路径)不会解决我的问题。

是否有可能通过修改代码或通过一些辅助配置来实现?

我已经阅读了有关使用 launchd 守护程序来使用 kextload 以加载扩展的信息,如 this question 中所述,但就我而言,我希望它尽早加载。

更新:
我正在使用 "generic" 内核扩展(链接到 BSD 库)而不是基于 I/O 套件的扩展。
我希望在 launchd 启动之前加载我的扩展程序。

如果kext是从IOKit派生出来的,并且驻留在/Library/Extensions清除缓存,它会在开机时自动加载。您通过调用

清除缓存
kextcache -f -update-volume /

您没有在问题中明确说明,但我从上下文推断您使用的是 "generic" 内核扩展(与基于 I/O 套件的内核扩展相反)?这些加载只是因为另一个 kext 依赖于它们,或者因为它们是通过 kextutil/kextload 或 KextManager API.

显式加载的

将此与 I/O Kit kexts 进行对比,当它们的个性词典之一与 IO 注册表中的注册服务匹配时,它们会按需加载。这通常用于驱动特定设备,但各种非硬件相关的系统服务使用该机制来匹配 'IOResources' nub (documentation),它在早期引导期间出现,因此任何 kexts 将其列为提供者对于个性也会在启动时加载。

因此解决方案是修改您的 kext 以提供与 IOResources nub 匹配的 IOService。如果您的用户空间组件已经使用另一个接口与 kext 通信,则服务本身实际上不需要做任何事情。

如果您不想更改 kext 的代码本身,您可以创建一个虚拟 kext 来执行此操作,但将您的主 kext 声明为依赖项。后一种方法不是特别优雅,但如果由于某种原因无法修改现有的 kext,应该可以使用。 (尽管您可能需要修改 info.plist)