openjdk.ruOpenJDK на русском

JEP 297: Unified arm32/arm64 Port

Единый порт для arm32/arm64

АвторEdward Nevill
ОтветственныйEd Nevill
ТипFeature
ОбластьImplementation
СтатусClosed / Delivered
Выпуск9
Компонентhotspot / compiler
Обсуждениеaarch32 dash port dash dev at openjdk dot java dot net
ТрудоёмкостьM
ДлительностьS
РецензентыBob Vandette, Mikael Vidstedt, Vladimir Kozlov
ОдобренMikael Vidstedt, Vladimir Kozlov
Создан2016/10/23 21:57
Обновлён2026/06/03 22:42
Задача8168503

Аннотация

Интегрировать в JDK единый порт HotSpot для arm32 и arm64, переданный компанией Oracle.

Мотивация

Основная мотивация — обеспечить поддержку arm32/aarch32 в JDK. Хотя поддержку arm32/aarch32 уже пытались реализовать, сегодня единственный сопровождаемый вариант в JDK — порт Zero. Вклад Oracle обеспечивает полную поддержку C1 и C2 для ARM, так что эта архитектура получает такой же уровень поддержки, как остальные.

Порт также поддерживает arm64/aarch64, но это менее важная причина, поскольку в JDK уже есть отдельный порт только для aarch64.

Описание

Вклад Oracle обеспечивает поддержку C1 и C2 как для arm32, так и для arm64. Код слит с деревом JDK 9 в отдельном репозитории в разделе проекта aarch32.

О намерении Oracle открыть исходный код порта для ARM было объявлено в рассылке aarch32 23 августа 2016 г., и с тех пор в рассылке aarch32 было несколько обсуждений. Чтобы посмотреть эти обсуждения, перейдите по ссылкам ниже.

На открытом созвоне в пятницу, 21 октября 2016 г., было решено добиваться включения этого порта в JDK. Официальный протокол не вёлся, но заметки со встречи были опубликованы в рассылке aarch32.

Webrev вклада Oracle доступен по адресу http://cr.openjdk.java.net/~bobv/arm3264/webrev, а объединённое дерево jdk9 — по адресу http://hg.openjdk.java.net/aarch32-port/jdk9-arm3264.

Из объединённого дерева можно собрать виртуальную машину minimal, client или server для arm32 или arm64. Из этого дерева можно также собрать существующий порт aarch64.

Есть дополнительный параметр, специфичный для ARM, — --with-cpu-port. С его помощью можно выбрать новую сборку для aarch64 --with-cpu-port=arm64 или существующую сборку для aarch64 --with-cpu-port=aarch64. Если параметр не указан, по умолчанию используется существующая сборка для aarch64.

Предполагается, что сборкой по умолчанию для aarch64 останется существующая сборка для aarch64.

Тестирование

Порт прошёл внутреннее тестирование в Oracle, поскольку он входит в проприетарную виртуальную машину Oracle. Поэтому он протестирован с помощью JPRT и других внутренних тестов.

Дерево JDK 9 в проекте aarch32 протестировано с помощью jtreg в различных конфигурациях, включая hard/soft FP, сборки release/debug и сборки client/server. В объединённом исходном коде нашлось несколько проблем, и они исправлены.

Риски

Изменения в общем коде сведены к минимуму. Переданный порт использует #ifdefs совместно с портом aarch64. Кроме того, #ifdefs для ARM уже есть в общем коде. Поэтому изменения в общем коде ограничиваются изменениями в сборке и одним #ifdef в libproc.h.

Поскольку исходный код взят из закрытого порта внутри Oracle, в Oracle он хорошо известен, и это значительно снижает риски, связанные с его слиянием с JDK.

Существует риск, что у тех, кто собирает JDK, возникнет путаница из-за того, что портов для aarch64 будет два: существующий порт aarch64 и единый порт arm32/arm64.