اندازه صفحه ۱۶ کیلوبایتی

اندازه صفحه میزان جزئیاتی است که سیستم‌عامل حافظه را با آن مدیریت می‌کند. امروزه اکثر واحدهای پردازش مرکزی از اندازه صفحه ۴ کیلوبایتی پشتیبانی می‌کنند و بنابراین سیستم‌عامل Android و برنامه‌ها به‌طور تاریخی برای اجرا با اندازه صفحه ۴ کیلوبایتی ساخته و بهینه‌سازی شده‌اند. پردازنده‌های ARM از اندازه صفحه بزرگ‌تر ۱۶ کیلوبایتی پشتیبانی می‌کنند و از Android 15،‏ AOSP از ساخت Android با اندازه صفحه ۱۶ کیلوبایتی نیز پشتیبانی می‌کند. این گزینه از حافظه اضافی استفاده می‌کند اما عملکرد سیستم را بهبود می‌بخشد. از Android 15، این گزینه به‌طور پیش‌فرض فعال نیست، اما به‌عنوان حالت توسعه‌دهنده یا گزینه توسعه‌دهنده برای سازندگان اصلی محصول و توسعه‌دهندگان نرم‌افزار دردسترس است تا برای جابه‌جایی به حالت ۱۶ کیلوبایتی در آینده آماده شوند.

‫Android 15 و نسخه‌های بالاتر از ساختن Android با ترازبندی ELF‏ ۱۶ کیلوبایتی پشتیبانی می‌کنند که با هسته‌های ۴ کیلوبایتی و ۱۶ کیلوبایتی از android14-6.1 کار می‌کند. وقتی با هسته ۱۶ کیلوبایتی استفاده شود، این پیکربندی از حافظه اضافی استفاده می‌کند اما عملکرد سیستم را بهبود می‌بخشد.

تنظیم Android روی ۱۶ کیلوبایت

صفحه‌های ۱۶ کیلوبایتی فقط در arm64 هدف با هسته‌های ۱۶ کیلوبایتی پشتیبانی می‌شود. بااین‌حال، گزینه‌ای هم برای شبیه‌سازی فضای کاربری ۱۶ کیلوبایتی در x86_64 برای Cuttlefish وجود دارد.

فضای هسته

برای هدف‌های arm64، اگر از Kleaf برای ساختن هسته استفاده کنید، --page_size=16k هسته را در حالت ۱۶ کیلوبایتی می‌سازد. اگر مستقیماً از پیکربندی هسته Linux استفاده می‌کنید، می‌توانید با تنظیم CONFIG_ARM64_16K_PAGES به‌جای CONFIG_ARM64_4K_PAGES، صفحات ۱۶ کیلوبایتی را انتخاب کنید.

فضای کاربر

برای فعال کردن پشتیبانی از اندازه صفحه ۱۶ کیلوبایتی در فضای کاربر Android، گزینه‌های ساخت زیر را در محصولتان تنظیم کنید:

  • PRODUCT_NO_BIONIC_PAGE_SIZE_MACRO := true تعریف PAGE_SIZE را برمی‌دارد و باعث می‌شود مؤلفه‌ها اندازه صفحه را در زمان اجرا تعیین کنند.
  • PRODUCT_MAX_PAGE_SIZE_SUPPORTED := 16384 که تضمین می‌کند فایل‌های ELF پلاتفرم با ترازبندی ۱۶ کیلوبایتی ساخته شده‌اند. این اندازه بزرگ‌تر از حد نیاز برای سازگاری در آینده است. با ترازبندی ELF‏ ۱۶ کیلوبایتی، هسته می‌تواند از اندازه‌های صفحه ۴ کیلوبایتی/۱۶ کیلوبایتی پشتیبانی کند.

تأیید پرچم‌های ساخت

پس‌از انتخاب هدف 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 را برگرداند، پرچم‌های ساخت شما به‌درستی برای کار با هسته ۱۶ کیلوبایتی تنظیم شده است. بااین‌حال، حتی اگر ساختمانی تأیید شود، ممکن است به‌دلیل تفاوت در محیط ۱۶ کیلوبایتی همچنان مشکلات زمان اجرا وجود داشته باشد.

برنامه‌نویسی سیستم با اندازه صفحه ۱۶ کیلوبایتی

اکثریت قریب به اتفاق کد در هر دستگاه مجهز به Android مستقیماً با اندازه صفحه سروکار ندارد. بااین‌حال، برای کدی که با صفحه‌ها سروکار دارد، رفتار تخصیص حافظه هسته تغییر می‌کند و باید این موضوع را درنظر داشته باشید تا کدی بنویسید که نه تنها سازگار باشد بلکه حداکثر عملکرد را داشته باشد و حداقل منابع را مصرف کند.

اگر mmap را در منطقه ۱ کیلوبایتی، ۲ کیلوبایتی، یا حداکثر ۴ کیلوبایتی در سیستم ۴ کیلوبایتی فراخوانی کنید، سیستم ۴ کیلوبایت را برای پیاده‌سازی این کار رزرو می‌کند. به‌عبارت دیگر، هنگام درخواست حافظه از هسته، هسته باید همیشه حافظه درخواستی را به نزدیک‌ترین اندازه صفحه گرد کند. برای مثال، اگر یک ناحیه ۵ کیلوبایتی را در یک ناحیه ۴ کیلوبایتی تخصیص دهید، هسته ۸ کیلوبایت تخصیص می‌دهد.

در هسته ۱۶ کیلوبایتی، این «انتهای» اضافی صفحه‌ها بزرگ‌تر است. برای مثال، همه این تخصیص‌ها، از ۱ کیلوبایت تا ۵ کیلوبایت، وقتی با هسته ۱۶ کیلوبایتی استفاده شوند، ۱۶ کیلوبایت تخصیص می‌دهند. اگر ‫۱۷ کیلوبایت درخواست کنید، ۳۲ کیلوبایت تخصیص داده می‌شود.

برای مثال، در سیستم ۴ کیلوبایتی، اختصاص دادن دو ناحیه ناشناس خواندنی-نوشتنی ۴ کیلوبایتی مشکلی ندارد. اما در هسته ۱۶ کیلوبایتی، این کار منجر به اختصاص دادن دو صفحه یا ۳۲ کیلوبایت می‌شود. در هسته ۱۶ کیلوبایتی، درصورت امکان، این مناطق می‌توانند در یک صفحه خوانا یا نوشتنی ترکیب شوند تا فقط ۱۶ کیلوبایت استفاده شود و در مقایسه با هسته ۴ کیلوبایتی، ۸ کیلوبایت هدررفت داشته باشد. برای کاهش بیشتر استفاده از حافظه، می‌توان صفحات بیشتری را ترکیب کرد. درواقع، در یک سیستم ۱۶ کیلوبایتی که به‌طور حداکثری بهینه‌سازی شده است، صفحه‌های ۱۶ کیلوبایتی نسبت‌به سیستم‌های ۴ کیلوبایتی به حافظه کمتری نیاز دارند، زیرا اندازه جدول صفحه برای همان حافظه یک‌چهارم است.

هرگاه از mmap استفاده می‌کنید، مطمئن شوید که اندازه درخواستی را به نزدیک‌ترین اندازه صفحه گرد کنید. این کار تضمین می‌کند که کل مقدار حافظه‌ای که هسته اختصاص می‌دهد مستقیماً در مقادیر زمان اجرا برای فضای کاربر قابل‌مشاهده باشد، به‌جای اینکه به‌طور ضمنی درخواست شود و به‌طور ضمنی یا تصادفی قابل‌دسترسی باشد.

ساختن کتابخانه‌های مشترک با تراز ELF‏ ۱۶ کیلوبایتی

برای ساختن کتابخانه‌های مشترکی که بخشی از پروژه android هستند، تنظیمات قبلی در فعال کردن اندازه صفحه ۱۶ کیلوبایتی کافی است:

  • PRODUCT_NO_BIONIC_PAGE_SIZE_MACRO := true
  • PRODUCT_MAX_PAGE_SIZE_SUPPORTED := 16384

برای ساختن کتابخانه‌های مشترکی که بخشی از پروژه Android نیستند، باید این پرچم پیونددهنده را بگذرانید:

-Wl,-z,max-page-size=16384

درستی‌سنجی دودویی‌ها و پیش‌ساخته‌ها برای تراز ELF‏ ۱۶ کیلوبایتی

بهترین راه برای تأیید تراز و رفتار زمان اجرا، آزمایش و اجرا کردن در هسته ترجمه‌شده ۱۶ کیلوبایتی است. بااین‌حال، برای شناسایی زودتر برخی مشکلات:

  • از Android 16، می‌توانید PRODUCT_CHECK_PREBUILT_MAX_PAGE_SIZE := true را در زمان ساخت تنظیم کنید. از ignore_max_page_size: true در Android.bp و LOCAL_IGNORE_MAX_PAGE_SIZE := true در Android.mk برای نادیده گرفتن موقت آن‌ها استفاده کنید. این تنظیمات همه پیش‌ساخته‌ها را درستی‌سنجی می‌کند و به شما امکان می‌دهد تشخیص دهید که چه زمانی یکی از آن‌ها به‌روز شده است اما با ۱۶ کیلوبایت هم‌تراز نیست.

  • می‌توانید atest elf_alignment_test را اجرا کنید که تراز فایل‌های ELF درون‌دستگاهی را در دستگاه‌هایی که با Android 15 و نسخه‌های جدیدتر راه‌اندازی می‌شوند تأیید می‌کند.