Ukuran halaman adalah granularitas tempat OS mengelola memori. Sebagian besar CPU saat ini mendukung ukuran halaman 4 KB sehingga Android OS dan aplikasi secara historis dibuat 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 membuat 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 untuk OEM dan developer aplikasi agar dapat bersiap beralih ke mode 16 KB di mana saja pada masa mendatang.
Android 15 dan yang lebih tinggi memiliki dukungan untuk membuat
Android dengan penyelarasan 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.
Menetapkan Android ke 16 KB
Halaman 16 KB hanya didukung pada target arm64 dengan kernel 16 KB.
Namun, ada juga opsi untuk
menyimulasikan 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 menggunakan konfigurasi kernel Linux secara langsung, Anda dapat memilih halaman 16 KB dengan menetapkan CONFIG_ARM64_16K_PAGES, bukan CONFIG_ARM64_4K_PAGES.
Untuk mengetahui detail biner Generic Kernel Image (GKI) 16 KB yang telah dibuat sebelumnya, cabang yang didukung, serta rilis dan respin, lihat Rilis GKI 16 KB dan Build rilis GKI.
Ruang pengguna
Untuk mengaktifkan dukungan ukuran halaman 16 KB di ruang pengguna Android, tetapkan opsi build berikut pada produk Anda:
PRODUCT_NO_BIONIC_PAGE_SIZE_MACRO := truemenghapus definisiPAGE_SIZE, dan membuat komponen menentukan ukuran halaman saat runtime.PRODUCT_MAX_PAGE_SIZE_SUPPORTED := 16384yang memastikan file ELF platform dibuat dengan penyelarasan 16 KB. Ukuran yang lebih besar dari yang diperlukan ini ditujukan untuk kompatibilitas di masa mendatang. Dengan penyelarasan ELF 16 KB, kernel dapat mendukung ukuran halaman 4 KB/16 KB.
Memverifikasi flag build
Setelah memilih target lunch, verifikasi bahwa flag build telah 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, mungkin masih ada masalah runtime karena perbedaan di lingkungan 16 KB.
Pemrograman sistem ukuran halaman 16 KB
Sebagian besar kode di perangkat yang didukung Android tidak langsung menangani ukuran halaman. 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 memiliki performa maksimal dan penggunaan resource minimal.
Jika Anda memanggil mmap pada region 1 KB, 2 KB, atau hingga 4 KB pada sistem 4 KB, sistem akan mencadangkan 4 KB untuk mengimplementasikan 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 ekor" 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, 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 menghasilkan 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, dan 8 KB terbuang 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 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.
Membuat pustaka bersama dengan penyelarasan ELF 16 KB
Untuk membuat pustaka bersama yang merupakan bagian dari project Android, setelan sebelumnya di Mengaktifkan ukuran halaman 16 KB sudah cukup:
PRODUCT_NO_BIONIC_PAGE_SIZE_MACRO := truePRODUCT_MAX_PAGE_SIZE_SUPPORTED := 16384
Untuk membuat pustaka 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 penyelarasan dan perilaku runtime adalah dengan menguji dan menjalankan kernel yang dikompilasi 16 KB. Namun, untuk menangkap beberapa masalah lebih awal:
Mulai Android 16, Anda dapat menetapkan
PRODUCT_CHECK_PREBUILT_MAX_PAGE_SIZE := truepada waktu build. Gunakanignore_max_page_size: truediAndroid.bpdanLOCAL_IGNORE_MAX_PAGE_SIZE := truediAndroid.mkuntuk mengabaikan mereka sementara. Setelan ini memverifikasi semua prebuilt dan memungkinkan Anda mendeteksi kapan prebuilt diupdate, tetapi tidak diselaraskan dengan 16 KB.Anda dapat menjalankan
atest elf_alignment_testyang memverifikasi penyelarasan file ELF di perangkat pada perangkat yang diluncurkan dengan Android 15 dan yang lebih baru.