JEP 391: macOS/AArch64 移植
总结
将 JDK 移植到 macOS/AArch64。
非目标
- 即使其他 AArch64 移植版本实现了所有可选组件(例如,编译器内联函数),我们的目标并不是实现所有这些可选组件。
- 对于 macOS/AArch64 以外的目标平台,支持写或执行(W^X)内存保护策略并不是我们的目标。
动机
Apple 已宣布了一项长期计划,将其 Macintosh 电脑系列从 x64 过渡到 AArch64。因此,我们预计 macOS/AArch64 版本的 JDK 将会有广泛的需求。
虽然可以通过 macOS 内置的 Rosetta 2 转译器在基于 AArch64 的系统上运行 macOS/x64 版本的 JDK,但转译几乎肯定会带来显著的性能损失。
描述
macOS/AArch64 禁止内存段同时具有可执行和可写属性,这一策略被称为 write-xor-execute (W^X)。HotSpot 虚拟机经常创建并修改可执行代码,因此本 JEP 将在 HotSpot 中为 macOS/AArch64 实现 W^X 支持。
测试
测试将包括但不限于与 TCK 的兼容性测试、使用 jtreg 进行回归测试以及使用应用程序进行验证。执行环境将包括 Apple 提供的开发平台以及消费者硬件(一旦可用)。
风险与假设
-
针对 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 的集成,而其他部分可以并行开发。