Размер страницы 16 КБ

Размер страницы — это степень детализации, с которой ОС управляет памятью. Большинство процессоров сегодня поддерживают размер страницы 4 КБ, поэтому ОС Android и приложения исторически создавались и оптимизировались для работы с размером страницы 4 КБ. Процессоры ARM поддерживают больший размер страницы 16 КБ, а начиная с Android 15 AOSP также поддерживает создание Android с размером страницы 16 КБ. Этот вариант использует дополнительную память, но повышает производительность системы. Начиная с Android 15, эта опция не включена по умолчанию, но она доступна в качестве режима разработчика или опции разработчика для OEM-производителей и разработчиков приложений, чтобы подготовиться к переключению на режим 16 КБ повсюду в будущем.

Включить размер страницы 16 КБ

Страницы размером 16 КБ поддерживаются только на целевых устройствах arm64 с ядрами 16 КБ. Однако существует также возможность имитировать пользовательское пространство размером 16 КБ на x86_64 для Cuttlefish.

Для целей arm64 , если вы используете Kleaf для сборки ядра, --page_size=16k собирает ядро ​​в режиме 16 КБ. Если вы напрямую используете конфигурацию ядра Linux, вы можете выбрать страницы размером 16 КБ, установив CONFIG_ARM64_16K_PAGES вместо CONFIG_ARM64_4K_PAGES .

Чтобы включить поддержку размера страницы 16 КБ в пользовательском пространстве Android, установите в своем продукте следующие параметры сборки:

  • PRODUCT_NO_BIONIC_PAGE_SIZE_MACRO := true удаляет определение PAGE_SIZE и заставляет компоненты определять размер страницы во время выполнения.
  • PRODUCT_MAX_PAGE_SIZE_SUPPORTED := 16384 который гарантирует, что файлы ELF платформы создаются с выравниванием 16 КБ. Этот размер, превышающий необходимый, предназначен для совместимости в будущем. При выравнивании ELF 16 КБ ядро ​​может поддерживать размеры страниц 4 КБ/16 КБ.

Проверьте флаги сборки

После выбора цели lunch убедитесь, что флаги сборки правильно установлены в среде:

$ source build/envsetup.sh
$ lunch target

$ get_build_var TARGET_MAX_PAGE_SIZE_SUPPORTED
16384
$ get_build_var TARGET_NO_BIONIC_PAGE_SIZE_MACRO
true

Если предыдущие две команды возвращают 16384 и true соответственно, ваши флаги сборки установлены правильно.

Создавайте общие библиотеки с выравниванием ELF размером 16 КБ.

Для сборки общих библиотек, входящих в состав проекта Android , достаточно более ранних настроек в разделе «Включить размер страницы 16 КБ» :

  • PRODUCT_NO_BIONIC_PAGE_SIZE_MACRO := true
  • PRODUCT_MAX_PAGE_SIZE_SUPPORTED := 16384

Чтобы создать общие библиотеки, которые не являются частью проекта Android , вам необходимо передать этот флаг компоновщика:

-Wl,-z,max-page-size=16384

Проверьте двоичные файлы и готовые сборки на соответствие ELF размером 16 КБ.

Лучший способ проверить выравнивание и поведение во время выполнения — протестировать и запустить скомпилированное ядро ​​размером 16 КБ. Однако, чтобы выявить некоторые проблемы раньше:

  • Начиная с Android W (экспериментальная версия AOSP), вы можете установить PRODUCT_CHECK_PREBUILT_MAX_PAGE_SIZE := true во время сборки. Используйте ignore_max_page_size: true в Android.bp и LOCAL_IGNORE_MAX_PAGE_SIZE := true в Android.mk , чтобы временно игнорировать их. Эти параметры проверяют все готовые сборки и позволяют определить, когда одна из них обновлена, но не выровнена по размеру 16 КБ.

  • Вы можете запустить atest elf_alignment_test , который проверяет выравнивание файлов ELF на устройстве на устройствах, запускаемых с Android 15 и более поздних версий.