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 definisiPAGE_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. 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 perataan file ELF di perangkat pada perangkat yang diluncurkan dengan Android 15 dan yang lebih baru.