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

时间:2016-04-06 08:08:16

标签: macos kernel boot kernel-extension

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

是否有可能通过修改代码或通过某些辅助配置实现此目的?

我已经阅读过使用launchd守护进程来使用kextload加载扩展,如this question中所述,但在我的情况下,我希望尽早加载它。

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

2 个答案:

答案 0 :(得分:5)

你没有在问题中明确说明它,但我从上下文推断你正在使用“通用”内核扩展(与基于I / O工具包的扩展相比)?这些只是因为另一个kext依赖于它们,或者因为它们是通过kextutil / kextload或KextManager API显式加载而加载的。

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

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

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

答案 1 :(得分:0)

如果kext派生自IOKit并驻留在 / Library / Extensions 中,请清除缓存,并在启动时自动加载。您可以通过调用

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