Ukuran halaman 16KB

Ukuran halaman adalah tingkat perincian tempat OS mengelola memori. Sebagian besar CPU saat ini mendukung ukuran halaman 4 KB sehingga OS dan aplikasi Android secara historis telah di-build dan dioptimalkan untuk berjalan dengan ukuran halaman 4 KB. CPU ARM mendukung ukuran halaman 16 KB yang lebih besar, dan mulai dari Android 15, AOSP juga memiliki dukungan untuk mem-build 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 saja pada masa mendatang.

Android 15 dan yang lebih tinggi memiliki dukungan untuk mem-build 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 akan menggunakan memori tambahan tetapi meningkatkan performa sistem.

Menetapkan ruang pengguna Android ke 16 KB

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

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

Untuk mengaktifkan dukungan ukuran halaman 16 KB di ruang pengguna Android, tetapkan opsi build berikut pada 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 di-build dengan perataan 16 KB. Ukuran yang lebih besar dari yang diperlukan ini ditujukan untuk kompatibilitas di masa mendatang. Dengan perataan ELF 16 KB, kernel dapat mendukung ukuran halaman 4 KB/16 KB.

Memverifikasi flag build

Setelah memilih target lunch, pastikan flag 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 masing-masing menampilkan 16384 dan true, flag build Anda disiapkan dengan benar untuk berfungsi dengan kernel 16 KB. Namun, meskipun build lulus, mungkin masih ada masalah runtime karena perbedaan dalam lingkungan 16 KB.

Pemrograman sistem ukuran halaman 16 KB

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

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

Pada kernel 16 KB, "ekor" tambahan halaman ini lebih besar. Misalnya, semua alokasi ini, dari 1 KB hingga 5 KB akan mengaloksir 16 KB saat digunakan dengan kernel 16 KB. Jika Anda meminta 17 KB, sistem akan mengalokasikan 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 mengakibatkan alokasi 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 menyia-nyiakan 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 untuk memori yang sama.

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

Mem-build library bersama dengan perataan ELF 16 KB

Untuk mem-build 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 mem-build library bersama yang bukan bagian dari project android, Anda harus meneruskan flag penaut ini:

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

Memverifikasi biner dan prebuild untuk perataan ELF 16 KB

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

  • Mulai Android 16 (AOSP eksperimental), 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 perataan file ELF di perangkat pada perangkat yang diluncurkan dengan Android 15 dan yang lebih baru.