Skip to content

arm64e OS 配置 ​

仅适用于受支持的设备。 只有满足全部要求并列入受支持设备的设备才能使用本方法。 其他设备使用 arm64 配置(iOS 16 或 iPadOS 17,例如 ipados-17.7.11-21H461)和常规移植步骤。两个 arm64 目标共用 profiles/arch/arm64 中的 arm64 补丁系列。

arm64e 需要原生 PAC 硬件:CPU 实现指针认证,且虚拟机监控程序不阻止使用,见下面的要求。 没有 PAC 的设备继续使用 arm64:iOS 与 iPadOS 18 是最后支持 arm64 的版本,iOS 与 iPadOS 27 只提供 arm64e。 arm64e 配置以指针认证(PAC)编译 XNU,并链接目标 kernelcache 中的原版 arm64e kext。

新移植应选择 CPU 带 PAC 的设备,并优先使用 iOS 或 iPadOS 27 配置:其驱动、补丁和构建配方处于持续维护中。 本仓库的每个驱动和优化都必须同时适用于 17 和 27、arm64 和 arm64e,唯一的差别是构建目标, 即打包脚本的 --os 参数。只对一个目标有效的改动不予合并。

要求 ​

要求检查方法
每个启用的 CPU 实现 FEAT_PAuth,包括地址密钥和通用密钥ID_AA64ISAR1_EL1 的 APA 或 API、GPA 或 GPI 非零;或 ID_AA64ISAR2_EL1 的 APA3 和 GPA3 非零
XNU 运行在 EL1,并能写五组密钥寄存器在 EL1 写 APIAKey、APIBKey、APDAKey、APDBKey、APGAKey 不产生陷入
PAC 指令在 EL1 和 EL0 不陷入每个核上 PACIA 改变指针,AUTIA 还原指针
已有 SoC 支持SoC 仓库列在 SoC 支持 中
原生 4 KiB 一级翻译与 arm64 配置相同,见4 KiB 页

清除 HCR_EL2.APK 或 HCR_EL2.API 的虚拟机监控程序会使这些访问陷入。 每项检查结果记录在设备的 porting.toml 中。

受支持设备 ​

设备SoCOS 配置状态
shengSM8550ipados-27.0.1-24A446开发中

配置结构 ​

位置内容
profiles/arch/arm64earm64e 编译配置、PAC 密钥管理和 XNU 补丁系列
profiles/os/ipados-27.0.1-24A446XNU 12377.121.6 加 Darwin 26 调用、iPadOS 27.0.1 IPSW 固定版本、预链接根组件和 OS 补丁

OS 配置用 [os] arch = "arm64e" 选择架构。没有该项的配置使用 profiles/arch/arm64。 两种架构使用相同的组件,arm64e 构建把它们编译为 arm64e。

指针认证 ​

arm64e 镜像把认证指针存为链式修复,只记录密钥和混淆值。dyld 在加载镜像时为用户指针签名, XNU 在早期启动时为 kernel collection 的指针签名。签名都不在设备以外生成, 所以 CPU 的 PAC 算法不需要与 Apple 相同。

公开 XNU 源码只在 osfmk/arm64/pac_asm.h 中为半虚拟化的 VMAPPLE 平台设置密钥。 arm64e 配置为 ARMv8.3 密钥寄存器提供原生的密钥设置。

ARMv8.3 的 EL0 和 EL1 共用同一组密钥寄存器。当前配置每次启动生成一组随机密钥, 写入每个 CPU,并打开 SCTLR_EL1 的 EnIA、EnIB、EnDA、EnDB。 内核和所有进程共用这组密钥,所以 PAC 不在进程之间做隔离。

CPU 特性 ​

XNU 只通过 hw.optional sysctl 和 commpage 能力字公布 CPU 实际具备的特性。 SM8550 没有 SME。

操作步骤 ​

  1. 在每个启用的 CPU 上完成要求中的检查并记录结果。
  2. 在设备配置中设置 board.os_profile = "ipados-27.0.1-24A446",或对单次运行给 ./unixnu 传 --os 27。
  3. 运行 ./unixnu fetch 和 ./unixnu status --json,确认 arm64e 配置、XNU 版本和补丁顺序。
  4. 按构建依次构建内核、package、固件、payload、userdata 和启动镜像。
  5. 按启动验证顺序记录每个检查点。

事实 ​

  • 公开的 xnu-12377.121.6 源码在 osfmk/arm/pmap 中保留非 SPTM 的 pmap。
  • arm64e 内核使用 BCM2837 机器配置和非 SPTM 的 pmap 编译,并关闭 Apple CPU 计数器。
  • iPadOS 27 的 kernelcache 是 MH_FILESET,符号表已删除。kext 代码直接跳转到内核,所以 arm64 的 prelink 步骤不适用。

Released under the BSD-2-Clause-Patent License.