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çinAndroid.bp
'teignore_max_page_size: true
'yı veAndroid.mk
'teLOCAL_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.