对于 Apple Silicon / M1,macOS 驱动程序包系统扩展应该是 arm64 还是 arm64e?
Should macOS driverkit system extensions be arm64 or arm64e for Apple Silicon / M1?
我将 macOS 驱动程序包系统扩展编译为通用库,因此它同时包含 x86_64
和 arm64
。当我连接 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 确实应该是 arm64
和 x86_64
(但正如 pmdj 解释的那样,系统二进制文件仍然是 arm64e
。)
正如 -arm64e_preview_abi
的名称(和需要)所暗示的那样,arm64e
目前仅作为开发人员预览公开,以便进行测试。
但是,您不应该得到 disallowing arm64
错误:您是否在计算机 B 上设置了其他有趣的引导参数? (特别是,amfi=
可能相关)
我将 macOS 驱动程序包系统扩展编译为通用库,因此它同时包含 x86_64
和 arm64
。当我连接 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 确实应该是 arm64
和 x86_64
(但正如 pmdj 解释的那样,系统二进制文件仍然是 arm64e
。)
正如 -arm64e_preview_abi
的名称(和需要)所暗示的那样,arm64e
目前仅作为开发人员预览公开,以便进行测试。
但是,您不应该得到 disallowing arm64
错误:您是否在计算机 B 上设置了其他有趣的引导参数? (特别是,amfi=
可能相关)