【问题标题】:Should macOS driverkit system extensions be arm64 or arm64e for Apple Silicon / M1?Apple Silicon / M1 的 macOS 驱动程序套件系统扩展应该是 arm64 还是 arm64e?
【发布时间】:2021-01-30 16:55:46
【问题描述】:

我将 macOS 驱动程序包系统扩展编译为通用库,以便它包含 x86_64arm64。一台 Apple Silicon 计算机 A 连接 USB 设备时驱动程序启动。在 Apple Silicon 计算机 B 上,当连接 USB 设备时,我可以看到在 Console.app 中打印了kernel: exec_mach_imgact: disallowing arm64 platform driverkit binary "com.example.driver", should be arm64e。我看过source code 发生这种情况的地方,但我无法弄清楚问题出在哪里。 如果我为 arm64e 编译它,那么它会在计算机 A 上得到 exec_mach_imgact: not running binary "com.example.driver" built against preview arm64e,然后它会在计算机 B 上启动。

没有一台计算机在boot-args 中设置了-arm64e_preview_abi

如果我在每台机器上创建一个新的 Xcode (12.4) 项目并构建 Release,那么计算机 A 和 otool -fvv com.example.driver 给出

Fat headers
fat_magic FAT_MAGIC
nfat_arch 2
architecture x86_64
    cputype CPU_TYPE_X86_64
    cpusubtype CPU_SUBTYPE_X86_64_ALL
    capabilities 0x0
    offset 16384
    size 73856
    align 2^14 (16384)
architecture arm64
    cputype CPU_TYPE_ARM64
    cpusubtype CPU_SUBTYPE_ARM64_ALL
    capabilities 0x0
    offset 98304
    size 73856
    align 2^14 (16384)

在计算机 B 上给出相同的命令

Fat headers
fat_magic FAT_MAGIC
nfat_arch 2
architecture x86_64
    cputype CPU_TYPE_X86_64
    cpusubtype CPU_SUBTYPE_X86_64_ALL
    capabilities 0x0
    offset 16384
    size 73280
    align 2^14 (16384)
architecture arm64
    cputype CPU_TYPE_ARM64
    cpusubtype CPU_SUBTYPE_ARM64_ALL
    capabilities 0x0
    offset 98304
    size 73296
    align 2^14 (16384)

如何让驱动在两台机器上都启动?

【问题讨论】:

  • 在开始的那个切片上开始?难道它实际上是在罗塞塔运行的? (活动监视器会告诉你)
  • 架构在驱动程序启动的机器上的活动监视器中显示“Apple”。

标签: apple-silicon driverkit macos-system-extension


【解决方案1】:

Dexts 确实应该是 arm64x86_64(但正如 pmdj 解释的那样,系统二进制文件仍然是 arm64e。)

正如-arm64e_preview_abi 的名称(和需要)所暗示的那样,arm64e 目前仅作为开发者预览版公开,以便进行测试。

但是,您不应该收到 disallowing arm64 错误:您是否在计算机 B 上设置了其他有趣的引导参数? (尤其是amfi= 可能是相关的)

【讨论】:

  • 在某些时候我有boot-args="amfi_get_out_of_my_way=0x1",但我不确定删除它后是否错过了重新启动。现在我已经更新到 Big Sur 11.2 并且在更新操作系统后,驱动程序在它被构建为 x86_64 arm64 的通用二进制文件时启动
【解决方案2】:

到目前为止,我的经验表明,arm64e 是正确且唯一正确的 Apple Silicon 架构以用于 dexts。

一方面,出现“不允许 arm64 平台”错误,而且 Apple 自己的基于 DriverKit 的驱动程序是为 arm64e 构建的:

% otool -fvv /System/Library/DriverExtensions/com.apple.AppleUserHIDDrivers.dext/com.apple.AppleUserHIDDrivers
Fat headers
fat_magic FAT_MAGIC
nfat_arch 2
architecture x86_64
    cputype CPU_TYPE_X86_64
    cpusubtype CPU_SUBTYPE_X86_64_ALL
    capabilities 0x0
    offset 16384
    size 96208
    align 2^14 (16384)
architecture arm64e
    cputype CPU_TYPE_ARM64
    cpusubtype CPU_SUBTYPE_ARM64E
    capabilities CPU_SUBTYPE_ARM64E_PTRAUTH_VERSION 0
    offset 114688
    size 95312
    align 2^14 (16384)

这就留下了为什么您的arm64e 构建不起作用的问题。 “built against preview arm64e”错误表明问题不在于计算机,而在于二进制文件。您是否在 2 个系统上使用相同的二进制文件?也许有人禁用了 SIP,所以它更允许构建糟糕的二进制文件?

您是否在最新版本的 Xcode 上新创建的项目中尝试过“hello world”样式的 dext?检查是否在两台机器上本地运行。一旦工作正常,将 Xcode 的编译器和链接器命令行与构建脚本中的命令行进行比较 - 或者如果您也在使用 Xcode,请将目标的构建设置与“干净”设置进行比较。

【讨论】:

  • 我用更多信息更新了这个问题。我将尝试启动示例项目,但我怀疑它是否会在计算机 B 上启动,因为即使我创建了一个新的 Xcode 项目,二进制文件仍然是 arm64。
  • 我测试的二进制文件来自同一个安装程序,所以它们是相同的。两台机器上都禁用了 SIP。
  • 有趣的是read,Apple 说您可以使用arm64e 测试您的 driverkit 驱动程序。有关于如何设置-arm64e_preview_abiboot-args 的说明。由于 Xcode 默认构建 arm64,我认为 arm64 是现在应该使用的。可能会有所不同,具体取决于 dext 是操作系统附带的还是用户安装的。
  • 如果我明确地为x86_64arm64e 构建,那么capabilities 会显示PTR_AUTH_VERSION USERSPACE 0,这与capabilities 行的AppleUserHIDDrivers (CPU_SUBTYPE_ARM64E_PTRAUTH_VERSION 0) 不同跨度>
猜你喜欢
  • 1970-01-01
  • 2023-01-08
  • 2022-08-23
  • 2021-11-15
  • 2010-09-07
  • 2022-06-10
  • 2021-08-30
  • 1970-01-01
  • 2021-12-16
相关资源
最近更新 更多