اندازه صفحه، جزئیاتی است که در آن یک سیستم عامل حافظه را مدیریت می کند. اکثر پردازندههای مرکزی امروزه از اندازه صفحه 4 کیلوبایت پشتیبانی میکنند و بنابراین سیستمعامل اندروید و برنامهها در طول تاریخ ساخته و بهینهسازی شدهاند تا با اندازه صفحه 4 کیلوبایت اجرا شوند. CPU های ARM از اندازه صفحه بزرگتر 16 کیلوبایت پشتیبانی می کنند و با شروع اندروید 15، AOSP از ساخت اندروید با اندازه صفحه 16 کیلوبایت نیز پشتیبانی می کند. این گزینه از حافظه اضافی استفاده می کند اما عملکرد سیستم را بهبود می بخشد. از اندروید 15، این گزینه بهطور پیشفرض فعال نیست، اما بهعنوان یک حالت توسعهدهنده یا یک گزینه توسعهدهنده برای OEMها و توسعهدهندگان برنامهها در دسترس است تا در آینده برای تغییر به حالت 16 کیلوبایتی در همه جا آماده شوند.
اندروید 15 و بالاتر از ساخت اندروید با تراز ELF 16 کیلوبایتی پشتیبانی می کند که با هسته های 4 کیلوبایت و 16 کیلوبایت کار می کند. هنگامی که با یک هسته 16 کیلوبایتی استفاده می شود، این پیکربندی از حافظه اضافی استفاده می کند اما عملکرد سیستم را بهبود می بخشد.
فضای کاربری اندروید را روی ۱۶ کیلوبایت تنظیم کنید
صفحات 16 کیلوبایتی فقط در اهداف arm64
با هسته های 16 کیلوبایتی پشتیبانی می شوند. با این حال، گزینه ای برای شبیه سازی فضای کاربری 16 کیلوبایتی در x86_64
برای Cuttlefish نیز وجود دارد.
برای اهداف arm64
، اگر از Kleaf برای ساخت هسته خود استفاده می کنید، --page_size=16k
هسته را در حالت 16 کیلوبایتی می سازد. اگر مستقیماً از پیکربندی هسته لینوکس استفاده میکنید، میتوانید صفحات 16 کیلوبایتی را با تنظیم CONFIG_ARM64_16K_PAGES
به جای CONFIG_ARM64_4K_PAGES
انتخاب کنید.
برای فعال کردن پشتیبانی از اندازه صفحه 16 کیلوبایت در فضای کاربران اندروید، گزینه های ساخت زیر را روی محصول خود تنظیم کنید:
-
PRODUCT_NO_BIONIC_PAGE_SIZE_MACRO := true
تعریفPAGE_SIZE
را حذف می کند و باعث می شود که اجزاء اندازه صفحه را در زمان اجرا تعیین کنند. -
PRODUCT_MAX_PAGE_SIZE_SUPPORTED := 16384
که تضمین می کند فایل های پلتفرم ELF با تراز 16 کیلوبایتی ساخته شده اند. این اندازه بزرگتر از حد مورد نیاز برای سازگاری در آینده است. با تراز ELF 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 کیلوبایت
اکثریت قریب به اتفاق کدها در هر دستگاه مجهز به اندروید مستقیماً با اندازه صفحه سروکار ندارند. با این حال، برای کدهایی که با صفحات سروکار دارند، رفتار تخصیص حافظه هسته تغییر میکند، و باید این را در نظر داشته باشید تا کدی بنویسید که نه تنها سازگار باشد، بلکه حداکثر کارایی را نیز داشته باشد و به حداقل منابع نیاز دارد.
اگر mmap
روی یک منطقه 1 کیلوبایتی، 2 کیلوبایتی یا حداکثر 4 کیلوبایتی در یک سیستم 4 کیلوبایتی فراخوانی کنید، سیستم 4 کیلوبایت را برای پیاده سازی آن ذخیره می کند. به عبارت دیگر، هنگام درخواست حافظه از هسته، هسته باید همیشه حافظه درخواستی را به نزدیکترین اندازه صفحه گرد کند. به عنوان مثال، اگر یک منطقه 5 کیلوبایتی را به یک منطقه 4 کیلوبایتی اختصاص دهید، هسته 8 کیلوبایت را اختصاص می دهد.
در یک هسته 16 کیلوبایتی، این "انتهای انتهایی" اضافی صفحات بزرگتر هستند. به عنوان مثال، همه این تخصیص ها، از 1 کیلوبایت تا 5 کیلوبایت، در صورت استفاده با هسته 16 کیلوبایتی، 16 کیلوبایت را اختصاص می دهند. اگر 17 کیلوبایت درخواست کنید، 32 کیلوبایت را اختصاص می دهد.
به عنوان مثال، در یک سیستم 4 کیلوبایتی، تخصیص دو منطقه ناشناس خواندن و نوشتن 4 کیلوبایتی اشکالی ندارد. با این حال، در یک هسته 16 کیلوبایتی، این امر منجر به تخصیص دو صفحه یا 32 کیلوبایت می شود. در یک هسته 16 کیلوبایتی، در صورت امکان، این مناطق را می توان در یک صفحه خواندنی یا نوشتاری ترکیب کرد، به طوری که تنها 16 کیلوبایت استفاده می شود و 8 کیلوبایت در مقایسه با مورد هسته 4 کیلوبایتی هدر می رود. برای کاهش حتی بیشتر استفاده از حافظه، صفحات بیشتری را می توان ترکیب کرد. در واقع، در یک سیستم 16 کیلوبایتی که حداکثر بهینه سازی شده است، صفحات 16 کیلوبایتی نسبت به سیستم های 4 کیلوبایتی به حافظه کمتری نیاز دارند، زیرا اندازه جدول صفحه یک چهارم برای همان حافظه است.
هر زمان که از mmap
استفاده می کنید، اطمینان حاصل کنید که اندازه مورد نظر را تا نزدیکترین اندازه صفحه گرد کنید. این تضمین می کند که کل مقدار حافظه ای که کرنل تخصیص می دهد به جای اینکه به طور ضمنی درخواست شود و به طور ضمنی یا تصادفی در دسترس باشد، مستقیماً برای فضای کاربر در مقادیر زمان اجرا قابل مشاهده است.
ساخت کتابخانه های مشترک با تراز ELF 16 کیلوبایت
برای ساخت کتابخانه های مشترک که بخشی از پروژه اندروید هستند، تنظیمات قبلی در Enable 16 KB اندازه صفحه کافی است:
-
PRODUCT_NO_BIONIC_PAGE_SIZE_MACRO := true
-
PRODUCT_MAX_PAGE_SIZE_SUPPORTED := 16384
برای ساخت کتابخانه های مشترک که بخشی از پروژه اندروید نیستند، باید این پرچم پیوند دهنده را پاس کنید:
-Wl,-z,max-page-size=16384
باینری ها و پیش ساخته ها را برای تراز ELF 16 کیلوبایتی بررسی کنید
بهترین راه برای تأیید رفتار تراز و زمان اجرا، آزمایش و اجرا بر روی یک هسته کامپایل شده 16 کیلوبایتی است. با این حال، برای اینکه زودتر برخی از مسائل را تشخیص دهید:
با شروع Android W (AOSP آزمایشی)، میتوانید
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
اجرا کنید که تراز فایلهای ELF روی دستگاه را در دستگاههایی که با Android 15 و بالاتر راهاندازی میشوند تأیید میکند.