पेज साइज़, वह ग्रैन्युलैरिटी होती है जिस पर कोई ओएस मेमोरी मैनेज करता है. आजकल ज़्यादातर सीपीयू, 4 केबी वाले पेज साइज़ के साथ काम करते हैं. इसलिए, Android OS और ऐप्लिकेशन, 4 केबी वाले पेज साइज़ के साथ काम करने के लिए बनाए और ऑप्टिमाइज़ किए गए हैं. एआरएम सीपीयू, 16 केबी वाले बड़े पेज साइज़ के साथ काम करते हैं. Android 15 से, एओएसपी में Android को 16 केबी वाले पेज साइज़ के साथ बनाने की सुविधा भी उपलब्ध है. इस विकल्प से ज़्यादा मेमोरी का इस्तेमाल होता है, लेकिन इससे सिस्टम की परफ़ॉर्मेंस बेहतर होती है. Android 15 में, यह विकल्प डिफ़ॉल्ट रूप से चालू नहीं होता. हालांकि, यह डेवलपर मोड या ओईएम और ऐप्लिकेशन डेवलपर के लिए डेवलपर विकल्प के तौर पर उपलब्ध है. इससे, आने वाले समय में हर जगह 16 केबी मोड पर स्विच करने की तैयारी की जा सकती है.
Android 15 और इसके बाद के वर्शन में, Android को 16 केबी ईएलएफ़ अलाइनमेंट के साथ बनाने
की सुविधा है. यह 4 केबी और
16 केबी कर्नेल के साथ काम करता है
android14-6.1.
16 केबी कर्नेल के साथ इस्तेमाल करने पर, इस कॉन्फ़िगरेशन में ज़्यादा मेमोरी का इस्तेमाल होता है, लेकिन इससे सिस्टम की परफ़ॉर्मेंस बेहतर होती है.
Android को 16 केबी पर सेट करना
16 केबी वाले पेज, सिर्फ़ 16 केबी कर्नेल वाले arm64 टारगेट पर काम करते हैं.
हालांकि, कटलफ़िश के लिए
पर 16 केबी यूज़रस्पेस को सिम्युलेट करने का विकल्प भी है.x86_64
कर्नेल स्पेस
arm64 टारगेट के लिए, अगर कर्नेल बनाने के लिए
Kleaf
का इस्तेमाल किया जाता है, तो --page_size=16k से कर्नेल, 16 केबी मोड में बनता है.
अगर Linux कर्नेल कॉन्फ़िगरेशन का सीधे तौर पर इस्तेमाल किया जा रहा है, तो CONFIG_ARM64_4K_PAGES के बजाय CONFIG_ARM64_16K_PAGES सेट करके, 16 केबी वाले पेज चुने जा सकते हैं.
पहले से बनाए गए 16 केबी वाले जेनेरिक कर्नेल इमेज (जीकेआई) बाइनरी, काम करने वाली ब्रांच, और रिलीज़ और रीस्पिन की जानकारी के लिए, देखें 16 केबी जीकेआई रिलीज़ और जीकेआई रिलीज़ बिल्ड.
यूज़र स्पेस
Android यूज़र स्पेस में, 16 केबी वाले पेज साइज़ के साथ काम करने की सुविधा चालू करने के लिए, अपने प्रॉडक्ट पर ये बिल्ड विकल्प सेट करें:
PRODUCT_NO_BIONIC_PAGE_SIZE_MACRO := trueसेPAGE_SIZEकी परिभाषा हट जाती है. साथ ही, कॉम्पोनेंट रनटाइम पर पेज साइज़ तय करते हैं.PRODUCT_MAX_PAGE_SIZE_SUPPORTED := 16384से यह पक्का होता है कि प्लैटफ़ॉर्म ईएलएफ़ फ़ाइलें 16 केबी अलाइनमेंट के साथ बनाई गई हों. ज़रूरत से ज़्यादा बड़ा यह साइज़, आने वाले समय में काम करने की सुविधा के लिए है. 16 केबी ईएलएफ़ अलाइनमेंट की मदद से, कर्नेल 4 केबी/16 केबी वाले पेज साइज़ के साथ काम कर सकता है.
बिल्ड फ़्लैग की पुष्टि करना
lunch टारगेट चुनने के बाद, पुष्टि करें कि एनवायरमेंट में बिल्ड फ़्लैग सही तरीके से सेट अप किए गए हैं:
$ 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
अगर पिछली दो कमांड से क्रमशः 16384 और true मिलता है, तो आपके बिल्ड फ़्लैग, 16 केबी कर्नेल के साथ काम करने के लिए सही तरीके से सेट अप किए गए हैं. हालांकि, बिल्ड पास होने पर भी, 16 केबी एनवायरमेंट में अंतर की वजह से रनटाइम से जुड़ी समस्याएं हो सकती हैं.
16 केबी वाले पेज साइज़ के लिए सिस्टम प्रोग्रामिंग
Android पर चलने वाले किसी भी डिवाइस पर मौजूद ज़्यादातर कोड, पेज साइज़ से सीधे तौर पर डील नहीं करते. हालांकि, पेज से डील करने वाले कोड के लिए, कर्नेल का मेमोरी एलोकेशन बिहेवियर बदल जाता है. आपको कोड लिखते समय इस बात का ध्यान रखना होगा, ताकि कोड न सिर्फ़ काम करे, बल्कि ज़्यादा से ज़्यादा परफ़ॉर्म करे और कम से कम संसाधनों का इस्तेमाल करे.
अगर 4 केबी वाले सिस्टम पर, 1 केबी, 2 केबी या 4 केबी तक के किसी इलाके के लिए mmap कॉल किया जाता है, तो सिस्टम इसे लागू करने के लिए 4 केबी रिज़र्व करता है. दूसरे शब्दों में, कर्नेल से मेमोरी का अनुरोध करते समय, कर्नेल को हमेशा अनुरोध की गई मेमोरी को सबसे नज़दीकी पेज साइज़ तक राउंड अप करना चाहिए. उदाहरण के लिए, अगर 4 केबी वाले इलाके पर 5 केबी का इलाका असाइन किया जाता है, तो कर्नेल 8 केबी असाइन करता है.
16 केबी कर्नेल पर, पेजों के ये अतिरिक्त "टेल एंड" बड़े होते हैं. उदाहरण के लिए, 1 केबी से 5 केबी तक के इन सभी एलोकेशन को 16 केबी कर्नेल के साथ इस्तेमाल करने पर, 16 केबी असाइन किया जाएगा. अगर 17 केबी का अनुरोध किया जाता है, तो 32 केबी असाइन किया जाता है.
उदाहरण के लिए, 4 केबी वाले सिस्टम पर, 4 केबी के दो रीड-राइट एनॉनिमस इलाके असाइन किए जा सकते हैं. हालांकि, 16 केबी कर्नेल पर, इससे दो पेज या 32 केबी असाइन किए जाएंगे. 16 केबी कर्नेल पर, अगर मुमकिन हो, तो इन इलाकों को एक ही रीड या राइटेबल पेज में जोड़ा जा सकता है, ताकि सिर्फ़ 16 केबी का इस्तेमाल हो. इससे 4 केबी कर्नेल के मुकाबले 8 केबी की बचत होती है. मेमोरी के इस्तेमाल को और कम करने के लिए, ज़्यादा पेजों को जोड़ा जा सकता है. दरअसल, 16 केबी वाले सिस्टम को ज़्यादा से ज़्यादा ऑप्टिमाइज़ करने पर, 16 केबी वाले पेजों के लिए 4 केबी वाले सिस्टम के मुकाबले कम मेमोरी की ज़रूरत होती है. ऐसा इसलिए, क्योंकि एक ही मेमोरी के लिए पेज टेबल का साइज़ एक चौथाई होता है.
mmap का इस्तेमाल करते समय, पक्का करें कि अनुरोध किए जा रहे साइज़ को सबसे नज़दीकी पेज साइज़ तक राउंड अप किया गया हो. इससे यह पक्का होता है कि कर्नेल की ओर से असाइन की गई मेमोरी की पूरी रकम, रनटाइम वैल्यू में यूज़रस्पेस को सीधे तौर पर दिखे. इसके लिए, मेमोरी का अनुरोध करने और उसे ऐक्सेस करने के लिए, किसी अन्य तरीके का इस्तेमाल न किया गया हो.
16 केबी ईएलएफ़ अलाइनमेंट के साथ शेयर की गई लाइब्रेरी बनाना
Android प्रोजेक्ट का हिस्सा बनने वाली शेयर की गई लाइब्रेरी बनाने के लिए, 16 केबी वाले पेज साइज़ की सुविधा चालू करना में दी गई सेटिंग काफ़ी हैं:
PRODUCT_NO_BIONIC_PAGE_SIZE_MACRO := truePRODUCT_MAX_PAGE_SIZE_SUPPORTED := 16384
Android प्रोजेक्ट का हिस्सा न बनने वाली शेयर की गई लाइब्रेरी बनाने के लिए, आपको यह लिंकर फ़्लैग पास करना होगा:
-Wl,-z,max-page-size=16384
16 केबी ईएलएफ़ अलाइनमेंट के लिए बाइनरी और पहले से बनाए गए कॉम्पोनेंट की पुष्टि करना
अलाइनमेंट और रनटाइम बिहेवियर की पुष्टि करने का सबसे अच्छा तरीका है कि 16 केबी कंपाइल किए गए कर्नेल पर टेस्ट किया जाए और उसे चलाया जाए. हालांकि, कुछ समस्याओं को पहले ही पकड़ने के लिए:
Android 16 से, बिल्ड के समय
PRODUCT_CHECK_PREBUILT_MAX_PAGE_SIZE := trueसेट किया जा सकता है. इन्हें अस्थायी तौर पर अनदेखा करने के लिए,ignore_max_page_size: trueकोAndroid.bpमें औरLOCAL_IGNORE_MAX_PAGE_SIZE := trueकोAndroid.mkमें इस्तेमाल करें. इन सेटिंग से, पहले से बनाए गए सभी कॉम्पोनेंट की पुष्टि की जाती है. साथ ही, यह पता लगाया जा सकता है कि कोई कॉम्पोनेंट अपडेट किया गया है, लेकिन वह 16 केबी अलाइन नहीं है.atest elf_alignment_testचलाया जा सकता है. इससे, Android 15 और इसके बाद के वर्शन के साथ लॉन्च होने वाले डिवाइसों पर, डिवाइस में मौजूद ईएलएफ़ फ़ाइलों के अलाइनमेंट की पुष्टि की जाती है.