16 KB sayfa boyutu

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_SIZE tanımını kaldırır ve bileşenlerin sayfa boyutunu çalışma zamanında belirlemesini sağlar.
  • PRODUCT_MAX_PAGE_SIZE_SUPPORTED := 16384 Bu 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 := true
  • PRODUCT_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 := true değerini ayarlayabilirsiniz. Bunları geçici olarak yoksaymak için Android.bp ile ilişkili ignore_max_page_size: true ve Android.mk ile ilişkili LOCAL_IGNORE_MAX_PAGE_SIZE := true kullanı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_test komutunu çalıştırabilirsiniz.