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 definisiPAGE_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. Gunakanignore_max_page_size: true
diAndroid.bp
danLOCAL_IGNORE_MAX_PAGE_SIZE := true
diAndroid.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.