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

如何解决Apple Silicon / M1 的 macOS 驱动程序系统扩展应该是 arm64 还是 arm64e?

我将 macOS 驱动程序包系统扩展编译为通用库,以便它同时包含 x86_64arm64。一台 Apple Silicon 计算机 A 当我连接 USB 设备时,驱动程序会启动。在 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 上启动。

所有计算机都没有在 -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)

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

解决方法

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

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

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

,

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

首先,存在“不允许 arm64 平台”错误,而且 Apple 自己的基于 DriverKit 的驱动程序是为 arm64e 构建的:

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

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?