0

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

没有一台电脑-arm64e_preview_abi设置在boot-args.

如果我在每台机器上创建一个新的 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)

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

4

2 回答 2

1

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

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

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

于 2021-02-02T21:26:33.910 回答
0

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

一方面,存在“不允许 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,请将目标的构建设置与“干净”设置进行比较。

于 2021-01-31T10:41:05.763 回答