JEP 391:macOS/AArch64 端口
概括
将 JDK 移植到 macOS/AArch64。
非目标
-
实现所有可选组件(例如,编译器内在函数)并不是目标,即使它们是在其他 AArch64 端口中实现的。
-
支持 macOS/AArch64 以外的目标的写入异或执行 (W^X) 内存保护策略并不是目标。
动机
Apple 宣布了一项长期计划,将其 Macintosh 计算机系列从 x64 过渡到 AArch64。因此,我们预计 JDK 的 macOS/AArch64 端口会有广泛的需求。
尽管可以通过 macOS 内置的Rosetta 2转换器在基于 AArch64 的系统上运行 macOS/x64 版本的 JDK,但这种转换几乎肯定会带来显着的性能损失。
描述
Linux 的 AArch64 端口 ( JEP 237 ) 已经存在,Windows 的 AArch64 端口 ( JEP 388 )的工作正在进行中。我们希望通过使用条件编译(这在 JDK 的端口中很常见)来重用这些端口中的现有 AArch64 代码,以适应低级约定的差异,例如应用程序二进制接口 (ABI) 和保留的处理器寄存器集。
macOS/AArch64 禁止内存段同时可执行和可写,这一策略称为write-xor-execute (W^X)。 HotSpot VM 会定期创建和修改可执行代码,因此此 JEP 将在 macOS/AArch64 的 HotSpot 中实现 W^X 支持。
测试
测试包括但不限于 TCK 的兼容性测试、jtreg 的回归测试以及应用程序的验证。一旦可用,执行环境将包括苹果公司提供的开发平台以及消费者硬件。
风险和假设
-
macOS/AArch64 的更改可能会破坏现有的 Linux/AArch64、Windows/AArch64 和 macOS/x64 端口。通过广泛的预集成测试可以降低这种风险。
-
我们希望能够通过对共享 AArch64 代码进行相当小的更改来实现新的 ABI 约定。我们预计 macOS 特定代码的占用空间会很小。
-
我们预计 macOS/AArch64 和 Windows/AArch64 端口在某些方面相似,允许在这些端口之间共享一些代码,并进一步减少 macOS 特定的 AArch64 代码。
-
我们假设新版本的 macOS 与过去的版本不会有太大差异,因此新版本所需的代码更改量将会很小。
-
我们期望支持 W^X 策略将得到操作系统服务(例如
pthread_jit_write_protect_np
系统调用)的帮助。如果没有,我们将开发替代方法。第一个实现将以正确性为目标,但在不常见的情况下(例如去优化)可能会造成性能损失。
依赖关系
macOS/AArch64 端口和 Windows/AArch64 端口 ( JEP 388 ) 可能会共享一些代码。该 JEP 的某些部分将依赖于 JEP 388 的集成,而其他部分可以并行开发。