Skip to content

JEP 388: Windows/AArch64 Port | Windows/AArch64 端口

摘要

将 JDK 移植到 Windows/AArch64 平台。

动机

随着新的消费者级和服务器级 AArch64(ARM64)硬件的发布,由于终端用户的需求,Windows/AArch64 已成为一个重要平台。

描述

我们已经通过将先前为 Linux/AArch64 端口所做的工作扩展至 Windows/AArch64 平台,完成了 JDK 的移植工作(JEP 237)。该端口包括模板解释器、C1 和 C2 JIT 编译器,以及垃圾收集器(串行、并行、G1、Z 和 Shenandoah)。它支持 Windows 10 和 Windows Server 2016 操作系统。

本 JEP 的重点不是移植工作本身(这已基本完成),而是将该端口集成到 JDK 主线存储库中。

目前,我们拥有十几个变更集。我们将对共享代码的更改保持到最少。我们的更改将 AArch64 内存模型的支持扩展到 Windows,解决了 MSVC 的一些问题,为 AArch64 端口添加了 LLP64 支持,并在 Windows 上执行 CPU 特性检测。我们还修改了构建脚本,以更好地支持交叉编译和 Windows 工具链。

新的平台代码本身仅限于 15(+4)个文件和 1222(+322)行代码。

此处提供了早期访问的二进制文件。

测试

我们已在包括 Ampere eMAG1s、Marvell ThunderX2s(SMT 开启和关闭两种情况)和 Surface Pro Xs 在内的 AArch64 测试系统上进行了彻底的功能测试、性能测试和回归测试。我们的测试套件包括 JTReg、JCStress、jmh-jdk-microbenchmarks、JFC 应用程序和小程序(demo/jfc)、SPECJBB2005、SPECJBB2015、SPEC SERT、SPECJVM2008、DaCapo 以及一些较小的基准测试。其中两个测试矩阵有详细的文档记录:JTRegSPECJBB2015

除了 AArch64 系统外,我们还在 x64 系统(Intel Skylakes)上测试了我们的补丁。我们的测试覆盖范围包括 Linux/AArch64、Windows/AArch64、Windows/x64,以及仅用于功能测试的 Linux/x64。

我们为功能测试建立了一个强大的持续集成(CI)系统,并将继续通过 CI 系统对我们的补丁进行运行,以便在进一步更改时对其进行测试。

风险和假设

  • 我们对 Linux/AArch64 后端的共享代码进行了更改,以将 LP64(64 位长整数和指针)扩展到可以容纳 64 位 Windows 平台所需的长长整数和指针(LLP64)

  • 如前所述,我们还对 Windows 上的共享代码进行了修改。

  • 我们需要重新设计寄存器 x18 的使用方式,因为在 Windows/AArch64 上,该寄存器用于 Windows 线程环境块(TEB)。我们正与 AArch64 端口项目的负责人合作,以找到一种优雅的解决方案。