16 KB ページサイズ

ページサイズとは、OS がメモリを管理する際の粒度です。現在多くの CPU は、4 KB ページサイズをサポートしているため、Android OS やアプリは、4 KB ページサイズを実行できるようにビルド、最適化されてきました。ARM CPU は、より大きな 16 KB ページサイズをサポートしています。また、Android 15 以降、AOSP も 16 KB ページサイズでの Android のビルドをサポートしています。このオプションでは追加のメモリを使用しますが、システム パフォーマンスは向上します。Android 15 では、このオプションはデフォルトでは有効化されていませんが、デベロッパー モードまたはデベロッパー オプションとして利用できます。OEM やアプリ デベロッパーは、将来的にどこでも 16 KB モードに切り替えるための準備ができます。

16 KB ページサイズの有効化

16 KB ページがサポートされるのは、16 KB カーネルの arm64 ターゲットのみです。ただし、Cuttlefish の場合は、 x86_64 で 16 KB ユーザー空間をシミュレーションするオプションもあります。

arm64 ターゲットの場合、Kleaf でカーネルをビルドすると、--page_size=16k が 16 KB モードでカーネルをビルドします。Linux カーネル設定を直接使用している場合、CONFIG_ARM64_4K_PAGES の代わりに CONFIG_ARM64_16K_PAGES を設定することで 16 KB ページを選択できます。

Android ユーザー空間で 16 KB ページサイズのサポートを有効化するには、次のビルド オプションを設定します。

  • PRODUCT_NO_BIONIC_PAGE_SIZE_MACRO := true: PAGE_SIZE 定義を削除し、実行時にコンポーネントがページサイズを決定するようにします。
  • PRODUCT_MAX_PAGE_SIZE_SUPPORTED := 16384: プラットフォーム ELF ファイルが確実に 16 KB アライメントで作成されるようにします。サイズが必要以上に大きいのは、今後の互換性を考慮しているためです。16 KB ELF アライメントでは、カーネルで 4 KB / 16 KB のページサイズをサポートできます。

ビルドフラグを確認する

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

前の 2 つのコマンドで 16384 および true がそれぞれ返された場合は、ビルドフラグが適切に設定されていることになります。

16 KB ELF アライメントで共有ライブラリをビルドする

Android プロジェクトの一部である共有ライブラリをビルドするには、「16 KB ページサイズを有効にする」の前の設定で十分です。

  • PRODUCT_NO_BIONIC_PAGE_SIZE_MACRO := true
  • PRODUCT_MAX_PAGE_SIZE_SUPPORTED := 16384

Android プロジェクトの一部ではない共有ライブラリをビルドする場合は、以下のリンカーフラグを渡す必要があります。

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

16 KB ELF アライメントのバイナリおよび事前ビルドを確認する

アライメントと実行時の動作を確認するのに最適な方法は、コンパイルされた 16 KB カーネルでテスト、実行することです。ただし、次の方法で早期に問題を検出できます。

  • Android W(AOSP 試験運用版)以降、ビルド時に PRODUCT_CHECK_PREBUILT_MAX_PAGE_SIZE := true に設定できます。一時的に無視するには、Android.bpignore_max_page_size: true を、Android.mkLOCAL_IGNORE_MAX_PAGE_SIZE := true を使用します。これらの設定により、すべての事前ビルドを確認し、16 KB アライメントではない更新済みのビルドを検出できます。

  • Android 15 以降でリリースされるデバイスでは、atest elf_alignment_test を実行してデバイス上の ELF ファイルのアライメントを確認できます。