【问题标题】:Kernel Extension Not Loaded未加载内核扩展
【发布时间】:2017-07-19 15:18:51
【问题描述】:

我构建了一个自制的内核扩展(名为KAuthTest.kext)并想对其进行测试。所以在运行 macOS 10.12.3 的 VM 中,我做了以下操作:

  • 在恢复模式下运行 csrutil disable 禁用 SIP,然后重新启动。
  • 通过运行 sudo nvram kext-dev-mode=1 禁用 kext 签名检查并重新启动
  • 给它权限:sudo chown -R root:wheel KAuthTest.kext

然后我使用sudo kextload KAuthTest.kext 加载它。

然而,

  1. 在系统日志中,我没有从它的启动函数中看到日志
  2. 当我运行 kextstat | grep -v com.apple 查看所有第三方 kext 时,我没有看到我的内核扩展。

那么我错过了什么吗?我如何才能成功地将它加载到内核中?

注意:

  1. kextutil -n -print-diagnostics KAuthTest.kext 给出了这个:

    KAuthTest.kext 的诊断: 代码签名失败:代码签名无效 KAuthTest.kext 似乎是可加载的(包括磁盘库的链接)。

  2. 我确实尝试过重新启动,但仍然没有成功
  3. 如果重要,here 是 kext 的源代码

【问题讨论】:

  • $ sudo nvram boot-args="kext-dev-mode=1" # Has No Effect ...
  • @l'L'l ohh 感谢您的指出!我的问题仍然存在:
  • 您的kext 代码签名是偶然的吗?
  • @l'L'l,不,但我认为这并不重要,因为我禁用了 SIP,对吧?正如 Apple 所说的 here:“您可以为内部测试构建未签名的 kext,并在您的测试系统上禁用系统完整性保护以允许加载未签名的 kext。”
  • 好吧,根据正确的文档,虽然我从 Apple 开发人员那里听到了相互矛盾的信息......“所有的 kext 都必须签名并且必须住在 /Library/Extensions,因为 El Capitan。只有未签名的 kext可能永远在/System/Library/Extensions,但不再允许加载未签名的kext。”,来自这里:lists.apple.com/archives/darwin-kernel/2016/Jun/msg00010.html。所以我猜它确实需要进行代码签名。

标签: macos kernel darwin kernel-extension


【解决方案1】:

这里没有足够的信息来解决问题所在,所以我会给你一个快速的清单:

  • 禁用 SIP 足以加载未签名的 kext。在目标机器上使用csrutil status 检查它是否真的被禁用了。
  • 不要使用kextload来加载kexts,使用kextutil,不要使用-n。这个输出是什么?
  • 您尚未在所有printf 调用中添加换行符\n。始终以换行符结束,否则系统日志会混淆,您可能找不到消息。

由于您没有在 kextstat 中看到 kext,这确实表明在加载阶段存在问题。如果您的代码可能返回 KERN_SUCCESS 以外的其他内容,这可能是另一个错误来源。

kextutil 应该会告诉你出了什么问题。

【讨论】:

  • 与日志记录问题有关:在 WWDC 2017 期间,Apple 人员告诉我 Console.app 日志记录是有损的,如果我没有看到,他们建议我使用 log 命令行工具一些消息。
  • @MathPlayer 是的,对于 Sierra 和更新版本的日志记录情况,also see this answer。我相信如果内核以极快的速度发出日志,它仍然会被缓冲并且可以丢弃字符。获取无损日志的方法是使用kprintf(火线或串口)机制。
猜你喜欢
  • 2015-06-17
  • 2023-03-15
  • 2020-03-20
  • 2018-11-12
  • 2011-01-01
  • 2015-04-26
  • 2018-01-22
  • 2012-11-02
  • 1970-01-01
相关资源
最近更新 更多