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 desteklemektedir. Bu nedenle Android OS ve uygulamalar, geçmişte 4 KB sayfa boyutuyla çalışacak şekilde oluşturulmuş ve optimize edilmiştir. ARM CPU'lar daha büyük olan 16 KB sayfa boyutunu destekler ve 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 itibarıyla bu seçenek varsayılan olarak etkinleştirilmemiştir ancak gelecekte her yerde 16 KB moduna geçişe hazırlanmak için OEM'ler ve uygulama geliştiriciler tarafından geliştirici modu veya geliştirici seçeneği olarak kullanılabilir.

Android 15 ve sonraki sürümlerde, android14-6.1 ile başlayan 4 KB ve 16 KB çekirdeklerle çalışan 16 KB ELF uyumlu Android oluşturma desteği bulunur. 16 KB ç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 çekirdekli arm64 hedeflerinde desteklenir. Ancak Cuttlefish için x86_64 üzerinde 16 KB kullanıcı alanı simüle etme seçeneği de vardır.

Çekirdek alanı

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

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ımlamasını kaldırır ve bileşenlerin çalışma zamanında sayfa boyutunu belirlemesini sağlar.
  • PRODUCT_MAX_PAGE_SIZE_SUPPORTED := 16384 Bu, platform ELF dosyalarının 16 KB ile uyumlu olacak şekilde oluşturulmasını sağlar. Gerekenden büyük olan bu boyut, gelecekteki uyumluluk için belirlenmiştir. 16 KB ELF hizalamasıyla çekirdek, 4 KB/16 KB sayfa boyutlarını destekleyebilir.

Derleme işaretlerini doğrulama

lunch hedefi seçtikten sonra, ortamda derleme işaretlerinin 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 herhangi bir cihazdaki kodun büyük çoğunluğu doğrudan sayfa boyutuyla ilgilenmez. Ancak sayfalarla ilgili kodlarda çekirdeğin bellek ayırma davranışı değişir. Bu nedenle, yalnızca uyumlu değil aynı zamanda 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 olan bir bölgede mmap işlevini çağırırsanız sistem bunu uygulamak için 4 KB ayırır. Diğer 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 "uç kısımları" daha büyüktür. Örneğin, 1 KB ile 5 KB arasındaki tüm bu tahsisler, 16 KB'lık bir çekirdekle kullanıldığında 16 KB tahsis eder. 17 KB istediğinizde 32 KB ayrılır.

Ö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 çekirdekte bu işlem, iki sayfanın veya 32 KB'ın ayrılmasına neden olur. Mümkünse 16 KB çekirdekte bu bölgeler tek bir okunabilir veya yazılabilir sayfada birleştirilebilir. Böylece yalnızca 16 KB kullanılır ve 4 KB çekirdek durumuna kıyasla 8 KB boşa harcanır. Bellek kullanımını daha da azaltmak için daha fazla sayfa birleştirilebilir. Hatta maksimum düzeyde optimize edilmiş bir 16 KB sistemde, sayfa tablosu aynı bellek için dörtte bir boyutunda 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, çekirdeğin ayırdığı tüm bellek miktarının, çalışma zamanı değerlerinde kullanıcı alanına doğrudan görünür olmasını sağlar. Böylece, bellek miktarı örtülü olarak istenmez ve örtülü olarak veya yanlışlıkla erişilemez.

16 KB ELF uyumlu 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ş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 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 ayarlayabilirsiniz. Bunları geçici olarak yoksaymak için Android.bp'te ignore_max_page_size: true'yı ve Android.mk'te LOCAL_IGNORE_MAX_PAGE_SIZE := true'yi kullanın. Bu ayarlar, tüm önceden oluşturulmuş öğeleri doğrular ve bir öğe güncellendiğinde ancak 16 KB ile uyumlu olmadığında bunu tespit etmenize olanak tanır.

  • Android 15 ve sonraki sürümlerle kullanıma sunulan cihazlarda cihazdaki ELF dosyalarının hizalamasını doğrulayan atest elf_alignment_test komutunu çalıştırabilirsiniz.