Ukuran halaman 16 KB

Ukuran halaman adalah perincian saat OS mengelola memori. Sebagian besar CPU saat ini mendukung ukuran halaman 4 KB, sehingga OS Android dan aplikasi secara historis dibangun dan dioptimalkan untuk berjalan dengan ukuran halaman 4 KB. CPU ARM mendukung ukuran halaman 16 KB yang lebih besar, dan mulai Android 15, AOSP juga memiliki dukungan untuk membangun Android dengan ukuran halaman 16 KB. Opsi ini menggunakan memori tambahan, tetapi meningkatkan performa sistem. Mulai Android 15, opsi ini tidak diaktifkan secara default, tetapi tersedia sebagai mode developer atau opsi developer bagi OEM dan developer aplikasi untuk bersiap beralih ke mode 16 KB di mana pun pada masa mendatang.

Android 15 dan yang lebih tinggi memiliki dukungan untuk membangun Android dengan perataan ELF 16 KB, yang berfungsi dengan kernel 4 KB dan 16 KB mulai dari android14-6.1. Jika digunakan dengan kernel 16 KB, konfigurasi ini menggunakan memori tambahan, tetapi meningkatkan performa sistem.

Menyetel Android ke 16 KB

Halaman 16 KB hanya didukung di target arm64 dengan kernel 16 KB. Namun, ada juga opsi untuk mensimulasikan ruang pengguna 16 KB di x86_64 untuk Cuttlefish.

Ruang kernel

Untuk target arm64, jika Anda menggunakan Kleaf untuk membuat kernel, --page_size=16k akan membuat kernel dalam mode 16 KB. Jika Anda menggunakan konfigurasi kernel Linux secara langsung, Anda dapat memilih halaman 16 KB dengan menyetel CONFIG_ARM64_16K_PAGES, bukan CONFIG_ARM64_4K_PAGES.

Ruang pengguna

Untuk mengaktifkan dukungan ukuran halaman 16 KB di ruang pengguna Android, tetapkan opsi build berikut di produk Anda:

  • PRODUCT_NO_BIONIC_PAGE_SIZE_MACRO := true menghapus definisi PAGE_SIZE, dan membuat komponen menentukan ukuran halaman saat runtime.
  • PRODUCT_MAX_PAGE_SIZE_SUPPORTED := 16384 yang memastikan file ELF platform dibuat dengan penyelarasan 16 KB. Ukuran yang lebih besar dari yang diperlukan ini ditujukan untuk kompatibilitas pada masa mendatang. Dengan penyelarasan ELF 16 KB, kernel dapat mendukung ukuran halaman 4 KB/16 KB.

Memverifikasi flag build

Setelah memilih target lunch, pastikan tanda build disiapkan dengan benar di lingkungan:

$ 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

Jika dua perintah sebelumnya menampilkan 16384 dan true, flag build Anda telah disiapkan dengan benar untuk bekerja dengan kernel 16 KB. Namun, meskipun build lulus, masih mungkin ada masalah runtime karena perbedaan di lingkungan 16 KB.

Pemrograman sistem ukuran halaman 16 KB

Sebagian besar kode di perangkat yang didukung Android tidak secara langsung menangani ukuran halaman. Namun, untuk kode yang menangani halaman, perilaku alokasi memori kernel berubah, dan Anda harus mengingat hal ini untuk menulis kode yang tidak hanya kompatibel, tetapi juga memiliki performa maksimal dan penggunaan resource minimal.

Jika Anda memanggil mmap pada area 1 KB, 2 KB, atau hingga 4 KB pada sistem 4 KB, sistem akan mencadangkan 4 KB untuk menerapkan hal ini. Dengan kata lain, saat meminta memori dari kernel, kernel harus selalu membulatkan memori yang diminta ke ukuran halaman terdekat. Misalnya, jika Anda mengalokasikan region 5 KB pada region 4 KB, kernel akan mengalokasikan 8 KB.

Pada kernel 16 KB, "ujung akhir" halaman tambahan ini lebih besar. Misalnya, semua alokasi ini, dari 1 KB hingga 5 KB, akan mengalokasikan 16 KB saat digunakan dengan kernel 16 KB. Jika Anda meminta 17 KB, maka akan dialokasikan 32 KB.

Misalnya, pada sistem 4 KB, Anda dapat mengalokasikan dua region anonim baca-tulis 4 KB. Namun, pada kernel 16 KB, hal ini akan menghasilkan dalam mengalokasikan dua halaman atau 32 KB. Pada kernel 16 KB, jika memungkinkan, region ini dapat digabungkan menjadi satu halaman yang dapat dibaca atau ditulis sehingga hanya 16 KB yang digunakan, sehingga membuang 8 KB dibandingkan dengan kasus kernel 4 KB. Untuk mengurangi penggunaan memori lebih lanjut, lebih banyak halaman dapat digabungkan. Faktanya, pada sistem 16 KB yang dioptimalkan secara maksimal, halaman 16 KB memerlukan lebih sedikit memori daripada sistem 4 KB karena tabel halaman berukuran seperempat dari ukuran memori yang sama.

Setiap kali menggunakan mmap, pastikan Anda membulatkan ukuran yang Anda minta ke atas ke ukuran halaman terdekat. Hal ini memastikan bahwa seluruh jumlah memori yang dialokasikan kernel terlihat langsung oleh ruang pengguna dalam nilai runtime, bukan diminta secara implisit dan dapat diakses secara implisit atau tidak sengaja.

Membangun library bersama dengan penyelarasan ELF 16 KB

Untuk membuat library bersama yang merupakan bagian dari project Android, setelan sebelumnya di Aktifkan ukuran halaman 16 KB sudah cukup:

  • PRODUCT_NO_BIONIC_PAGE_SIZE_MACRO := true
  • PRODUCT_MAX_PAGE_SIZE_SUPPORTED := 16384

Untuk membuat library bersama yang bukan bagian dari project Android, Anda harus meneruskan flag linker ini:

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

Memverifikasi biner dan prebuilt untuk penyelarasan ELF 16 KB

Cara terbaik untuk memverifikasi perataan dan perilaku runtime adalah dengan menguji dan menjalankan kernel yang dikompilasi 16 KB. Namun, untuk mengidentifikasi beberapa masalah lebih awal:

  • Mulai Android 16, Anda dapat menetapkan PRODUCT_CHECK_PREBUILT_MAX_PAGE_SIZE := true pada waktu build. Gunakan ignore_max_page_size: true di Android.bp dan LOCAL_IGNORE_MAX_PAGE_SIZE := true di Android.mk untuk mengabaikannya sementara. Setelan ini memverifikasi semua prebuilt dan memungkinkan Anda mendeteksi saat salah satu prebuilt diperbarui, tetapi tidak selaras dengan 16 KB.

  • Anda dapat menjalankan atest elf_alignment_test yang memverifikasi penyelarasan file ELF di perangkat pada perangkat yang diluncurkan dengan Android 15 dan yang lebih baru.