在早期启动过程中加载 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)
我有一个可用的 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)