Sayfa boyutu, bir işletim sisteminin belleği yönettiği ayrıntı düzeyidir. Günümüzde çoğu CPU, 4 KB'lık sayfa boyutunu destekler. Bu nedenle Android OS ve uygulamalar, geçmişten beri 4 KB'lık sayfa boyutuyla çalışacak şekilde oluşturulmuş ve optimize edilmiştir. ARM CPU'lar daha büyük olan 16 KB sayfa boyutunu destekler. Android 15'ten itibaren AOSP, Android'i 16 KB sayfa boyutuyla oluşturmayı da destekler. Bu seçenek ek bellek kullanır ancak sistem performansını artırır. Android 15'ten itibaren bu seçenek varsayılan olarak etkinleştirilmez ancak OEM'lerin ve uygulama geliştiricilerin gelecekte her yerde 16 KB moduna geçişe hazırlanmaları için geliştirici modu veya geliştirici seçeneği olarak kullanılabilir.
Android 15 ve sonraki sürümler, 16 KB ELF hizalamasıyla Android derlemeyi destekler. Bu hizalama, android14-6.1 sürümünden itibaren 4 KB ve 16 KB çekirdeklerle çalışır.
16 KB'lık bir çekirdekle kullanıldığında bu yapılandırma ek bellek kullanır ancak sistem performansını artırır.
Android'i 16 KB olarak ayarlama
16 KB sayfalar yalnızca 16 KB çekirdeğe sahip arm64 hedeflerinde desteklenir.
Ancak Cuttlefish için x86_64 üzerinde 16 KB kullanıcı alanını simüle etme seçeneği de vardır.
Çekirdek alanı
arm64 hedefleri için çekirdeğinizi derlemek üzere Kleaf kullanırsanız --page_size=16k, çekirdeği 16 KB modunda derler.
Linux çekirdek yapılandırmasını doğrudan kullanıyorsanız CONFIG_ARM64_4K_PAGES yerine CONFIG_ARM64_16K_PAGES ayarlayarak 16 KB'lık sayfaları seçebilirsiniz.
Önceden oluşturulmuş 16 KB'lık Genel Çekirdek Görüntüsü (GKI) ikilileri, desteklenen dallar, yayın ve yeniden döndürme ayrıntıları için 16 KB GKI yayınları ve GKI yayınlanan derlemeleri başlıklı makaleleri inceleyin.
Kullanıcı alanı
Android kullanıcı alanında 16 KB sayfa boyutu desteğini etkinleştirmek için ürününüzde aşağıdaki derleme seçeneklerini ayarlayın:
PRODUCT_NO_BIONIC_PAGE_SIZE_MACRO := true,PAGE_SIZEtanımını kaldırır ve bileşenlerin sayfa boyutunu çalışma zamanında belirlemesini sağlar.PRODUCT_MAX_PAGE_SIZE_SUPPORTED := 16384Bu sayede platform ELF dosyaları 16 KB hizalamayla oluşturulur. Gereğinden büyük olan bu boyut, gelecekteki uyumluluk için belirlenmiştir. 16 KB ELF hizalaması sayesinde çekirdek, 4 KB/16 KB sayfa boyutlarını destekleyebilir.
Derleme işaretlerini doğrulama
lunch hedefini seçtikten sonra, derleme işaretlerinin ortamda doğru şekilde ayarlandığını doğrulayın:
$ 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
Önceki iki komut sırasıyla 16384 ve true değerlerini döndürürse derleme işaretleriniz 16 KB'lık bir çekirdekle çalışacak şekilde doğru ayarlanmıştır. Ancak derleme başarılı olsa bile 16 KB'lık bir ortamdaki farklılıklar nedeniyle çalışma zamanı sorunları yaşanabilir.
16 KB sayfa boyutu sistem programlama
Android destekli cihazlardaki kodların büyük çoğunluğu sayfa boyutuyla doğrudan ilgili değildir. Ancak sayfalarla ilgili kodlar için çekirdeğin bellek ayırma davranışı değişir. Hem uyumlu hem de maksimum performanslı ve minimum kaynak yoğunluklu kod yazmak için bunu göz önünde bulundurmanız gerekir.
4 KB'lık bir sistemde 1 KB, 2 KB veya 4 KB'a kadar bir bölgede mmap çağrısı yaparsanız sistem bunu uygulamak için 4 KB ayırır. Başka bir deyişle, çekirdekten bellek istenirken çekirdek, istenen belleği her zaman en yakın sayfa boyutuna yuvarlamalıdır. Örneğin, 4 KB'lık bir bölgede 5 KB'lık bir bölge ayırırsanız çekirdek 8 KB ayırır.
16 KB'lık bir çekirdekte, sayfaların bu ekstra "kuyruk uçları" daha büyüktür. Örneğin, 1 KB ile 5 KB arasındaki tüm bu ayırmalar, 16 KB'lık bir çekirdekle kullanıldığında 16 KB ayırır. 17 KB isterseniz 32 KB tahsis edilir.
Örneğin, 4 KB'lık bir sistemde iki 4 KB'lık okuma/yazma anonim bölgesi ayırmak sorun değildir. Ancak 16 KB'lık bir çekirdekte bu işlem, iki sayfa veya 32 KB'lık bir alanın ayrılmasına neden olur. 16 KB'lık bir çekirdekte mümkünse bu bölgeler tek bir okunabilir veya yazılabilir sayfada birleştirilebilir. Böylece yalnızca 16 KB kullanılır ve 4 KB'lık çekirdek durumuna kıyasla 8 KB boşa harcanır. Bellek kullanımını daha da azaltmak için daha fazla sayfa birleştirilebilir. Aslında, maksimum düzeyde optimize edilmiş 16 KB'lık bir sistemde, 16 KB'lık sayfalar 4 KB'lık sistemlere göre daha az bellek gerektirir. Bunun nedeni, sayfa tablosunun aynı bellek için dörtte bir boyutunda olmasıdır.
mmap kullanırken istediğiniz boyutu en yakın sayfa boyutuna yuvarladığınızdan emin olun. Bu sayede, çekirdeğin ayırdığı tüm bellek miktarı, çalışma zamanı değerlerinde kullanıcı alanına doğrudan görünür hale gelir. Böylece, bellek miktarı örtülü olarak istenmez ve örtülü veya yanlışlıkla erişilemez.
16 KB ELF uyumlu paylaşılan kitaplıklar oluşturun
Android projesinin bir parçası olan paylaşılan kitaplıklar oluşturmak için 16 KB sayfa boyutunu etkinleştirme bölümündeki önceki ayarlar yeterlidir:
PRODUCT_NO_BIONIC_PAGE_SIZE_MACRO := truePRODUCT_MAX_PAGE_SIZE_SUPPORTED := 16384
android projesinin parçası olmayan paylaşılan kitaplıklar oluşturmak için şu bağlayıcı işaretini iletmeniz gerekir:
-Wl,-z,max-page-size=16384
16 KB ELF uyumluluğu için ikili dosyaları ve önceden oluşturulmuş dosyaları doğrulayın
Hizalama ve çalışma zamanı davranışını doğrulamanın en iyi yolu, 16 KB'lık derlenmiş bir çekirdek üzerinde test etmek ve çalıştırmaktır. Ancak bazı sorunları daha erken tespit etmek için:
Android 16'dan itibaren, derleme sırasında
PRODUCT_CHECK_PREBUILT_MAX_PAGE_SIZE := truedeğerini ayarlayabilirsiniz. Bunları geçici olarak yoksaymak içinAndroid.bpile ilişkiliignore_max_page_size: trueveAndroid.mkile ilişkiliLOCAL_IGNORE_MAX_PAGE_SIZE := truekullanın. Bu ayarlar, tüm önceden derlenmiş dosyaları doğrular ve güncellenen ancak 16 KB uyumlu olmayan dosyaları tespit etmenize olanak tanır.Android 15 ve sonraki sürümlerle kullanıma sunulan cihazlarda cihaz üzerindeki ELF dosyalarının hizalamasını doğrulayan
atest elf_alignment_testkomutunu çalıştırabilirsiniz.