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

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

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

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

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

فضای هسته

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

فضای کاربری

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

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

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

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

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

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

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

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

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

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

  • PRODUCT_NO_BIONIC_PAGE_SIZE_MACRO := true
  • PRODUCT_MAX_PAGE_SIZE_SUPPORTED := 16384

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

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

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

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

  • با شروع از اندروید ۱۶، می‌توانید در زمان ساخت، 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 روی دستگاه را در دستگاه‌هایی که با اندروید ۱۵ و بالاتر راه‌اندازی می‌شوند، تأیید می‌کند.