JEP 391: macOS/AArch64 Port | macOS/AArch64 端口
摘要
将 JDK 移植到 macOS/AArch64 平台。
非目标
即便在其他 AArch64 端口中已经实现,实现所有可选组件(如编译器内建函数)也并非本项目的目标。
支持除 macOS/AArch64 以外的目标的写异或执行(W^X)内存保护策略并非本项目的目标。
动机
苹果公司已宣布了一项长期计划,即 将其 Macintosh 电脑系列从 x64 架构过渡到 AArch64 架构。因此,我们预计将看到对 macOS/AArch64 版本的 JDK 的广泛需求。
虽然可以通过 macOS 内置的 Rosetta 2 翻译器在基于 AArch64 的系统上运行 macOS/x64 构建的 JDK,但这种翻译几乎肯定会引入显著的性能损失。
描述
对于 Linux,已经存在一个 AArch64 端口(JEP 237),并且针对 Windows 的 AArch64 端口工作也在进行中(JEP 388)。我们计划通过条件编译(JDK 移植中的常规做法)来复用这些端口中现有的 AArch64 代码,以适应低级别约定(如应用程序二进制接口 (ABI) 和保留的处理器寄存器集)之间的差异。
macOS/AArch64 禁止内存段同时可执行和可写,这一策略被称为 写异或执行(W^X)。HotSpot VM 会定期创建和修改可执行代码,因此本 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 的集成,而其他部分则可以并行开发。