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

اندازه صفحه میزان جزئیاتی است که سیستم‌عامل حافظه را با آن مدیریت می‌کند. اکثر پردازنده‌های مرکزی امروزی از اندازه صفحه ۴ کیلوبایتی پشتیبانی می‌کنند و بنابراین سیستم‌عامل 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، صفحه‌های ۱۶ کیلوبایتی را انتخاب کنید.

برای باینری‌های «تصویر هسته عمومی» (GKI) ۱۶ کیلوبایتی ازپیش‌ساخته، شاخه‌های پشتیبانی‌شده، و جزئیات انتشار و بازتولید، به نسخه‌های پخش GKI‏ ۱۶ کیلوبایتی و ساخت‌های نسخه پخش GKI مراجعه کنید.

فضای کاربر

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