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 sayfa boyutunu desteklediğinden Android OS ve uygulamaları geçmişte 4 KB sayfa boyutuyla çalışacak şekilde tasarlanmış ve optimize edilmiştir. ARM CPU'lar daha büyük 16 KB sayfa boyutunu destekler. Android 15'ten itibaren AOSP, Android'i 16 KB sayfa boyutuyla derleme desteğine de sahiptir. Bu seçenek ek bellek kullanır ancak sistem performansını iyileştirir. 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çmeye hazırlanması için geliştirici modu veya geliştirici seçeneği olarak kullanılabilir.

Android 15 ve sonraki sürümlerde, android14-6.1 sürümünden itibaren 4 KB ve 16 KB çekirdeklerle çalışan 16 KB ELF uyumluluğuyla Android oluşturma desteği vardır. 16 KB çekirdekle kullanıldığında bu yapılandırma ek bellek kullanır ancak sistem performansını artırır.

Android kullanıcı alanını 16 KB'ya ayarlama

16 KB sayfalar yalnızca 16 KB çekirdeklere sahip arm64 hedeflerinde desteklenir. Bununla birlikte, Cuttlefish için x86_64 üzerinde 16 KB kullanıcı alanı simüle etme seçeneği de vardır.

arm64 hedefleri için çekirdeğinizi oluşturmak üzere Kleaf kullanıyorsanız --page_size=16k, çekirdeği 16 KB modunda oluşturur. Doğrudan Linux çekirdek yapılandırmasını kullanıyorsanız CONFIG_ARM64_4K_PAGES yerine CONFIG_ARM64_16K_PAGES ayarlayarak 16 KB sayfalar seçebilirsiniz.

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ımlamasını kaldırır ve bileşenlerin çalışma zamanında sayfa boyutunu belirlemesini sağlar.
  • PRODUCT_MAX_PAGE_SIZE_SUPPORTED := 16384, platform ELF dosyalarının 16 KB'lık bir uyumla derlenmesini sağlar. İhtiyaç duyulandan daha büyük olan bu boyut, gelecekteki uyumluluk içindir. 16 KB ELF uyumluluğu sayesinde çekirdek 4 KB/16 KB sayfa boyutlarını destekleyebilir.

Derleme işaretlerini doğrulama

lunch hedefini seçtikten sonra, yapı 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 döndürürse derleme işaretleriniz 16 KB'lık bir çekirdekle çalışacak şekilde doğru şekilde ayarlanmıştır. Ancak bir derleme başarılı olsa bile 16 KB ortamındaki farklılıklar nedeniyle çalışma zamanında sorunlar yaşanabilir.

16 KB sayfa boyutu sistem programlama

Android destekli cihazlardaki kodun büyük çoğunluğu doğrudan sayfa boyutuyla ilgili değildir. Ancak sayfalarla ilgilenen kodlarda çekirdeğin bellek ayırma davranışı değişir. Bu nedenle, yalnızca uyumlu değil, aynı zamanda en yüksek performanslı ve en az kaynak yoğun kod yazmak için bunu göz önünde bulundurmanız gerekir.

4 KB 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. Diğer bir deyişle, çekirdekten bellek istendiğinde ç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 "sonu" 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ıracaktır. 17 KB isterseniz 32 KB ayrılır.

Örneğin, 4 KB'lık bir sistemde iki adet 4 KB'lık salt okunur anonim bölge ayırmak sorun oluşturmaz. Ancak 16 KB'lık bir çekirdekte bu, iki sayfa veya 32 KB'lık bir alan ayırmanıza neden olur. 16 KB'lık bir çekirdekte, mümkünse bu bölgeler tek bir okunabilir veya yazılabilir sayfa halinde birleştirilebilir. Böylece yalnızca 16 KB kullanılır ve 4 KB'lık çekirdek durumuna kıyasla 8 KB'lık bir alan 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ş bir 16 KB sistemde, sayfa tablosu aynı bellek için dörtte bir boyut olduğundan 16 KB sayfalar 4 KB sistemlerden daha az bellek gerektirir.

mmap kullanırken, istediğiniz boyutu en yakın sayfa boyutuna yuvarladığınızdan emin olun. Bu sayede, çekirdeğin ayırttığı bellek miktarının tamamı, dolaylı olarak istenip dolaylı olarak veya yanlışlıkla erişilebilir olmak yerine, çalışma zamanı değerlerinde kullanıcı alanı tarafından doğrudan görülebilir.

16 KB ELF uyumluluğuyla paylaşılan kitaplıklar oluşturma

Android projesinin bir parçası olan paylaşılan kitaplıklar oluşturmak için 16 KB sayfa boyutunu etkinleştir bölümündeki önceki ayarlar yeterlidir:

  • PRODUCT_NO_BIONIC_PAGE_SIZE_MACRO := true
  • PRODUCT_MAX_PAGE_SIZE_SUPPORTED := 16384

Android projesi kapsamında 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 derlenmiş dosyaları doğrulama

Hizalama ve çalışma zamanı davranışını doğrulamanın en iyi yolu, 16 KB derlenmiş bir çekirdekte test edip çalıştırmaktır. Ancak bazı sorunları daha erken tespit etmek için:

  • Android 16'dan (AOSP deneysel) itibaren PRODUCT_CHECK_PREBUILT_MAX_PAGE_SIZE := true değerini derleme zamanında ayarlayabilirsiniz. Geçici olarak yoksaymak için Android.bp içinde ignore_max_page_size: true ve Android.mk içinde LOCAL_IGNORE_MAX_PAGE_SIZE := true kullanın. Bu ayarlar, tüm önceden derlenmiş öğeleri doğrular ve bir öğenin güncellendiğini ancak 16 KB'ya hizalanmadığını algılamanıza olanak tanır.

  • Android 15 ve sonraki sürümlerin yüklü olduğu cihazlarda cihaz üzerindeki ELF dosyalarının uyumluluğunu doğrulayan atest elf_alignment_test aracını çalıştırabilirsiniz.