对于 Apple Silicon / M1,macOS 驱动程序包系统扩展应该是 arm64 还是 arm64e?

Should macOS driverkit system extensions be arm64 or arm64e for Apple Silicon / M1?

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

None 台计算机在 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)

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

我目前的经验表明 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”错误表明问题不在于计算机,而在于二进制文件。您在这两个系统上使用相同的二进制文件吗?也许有人禁用了 SIP,所以它更容许构建错误的二进制文件?

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

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

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

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