גודל הדף הוא רמת הפירוט שבה מערכת הפעלה מנהלת את הזיכרון. רוב המעבדים כיום תומכים בדפים בגודל 4KB, ולכן Android OS והאפליקציות נבנו ועברו אופטימיזציה כדי לפעול עם דפים בגודל 4KB. מעבדי ARM תומכים בגודל הדף הגדול יותר של 16KB, והחל מ-Android 15, ל-AOSP יש תמיכה גם בפיתוח Android עם גודל דף של 16KB. האפשרות הזו משתמשת בזיכרון נוסף אבל משפרת את ביצועי המערכת. החל מ-Android 15, האפשרות הזו לא מופעלת כברירת מחדל, אבל היא זמינה כמצב מפתח או כאפשרות למפתחים, כדי שיצרני ציוד מקורי ומפתחי אפליקציות יוכלו להתכונן למעבר למצב 16KB בכל מקום בעתיד.
Android 15 ואילך תומכים בבניית Android עם יישור ELF של 16KB, שפועל עם ליבות של 4KB ו-16KB החל מגרסה android14-6.1.
כשמשתמשים בה עם ליבת 16 KB, ההגדרה הזו משתמשת בזיכרון נוסף אבל משפרת את ביצועי המערכת.
הגדרת Android ל-16KB
דפים בגודל 16KB נתמכים רק ביעדי arm64 עם ליבות של 16KB.
עם זאת, יש גם אפשרות לדמות מרחב משתמש של 16KB ב-x86_64 ל-Cuttlefish.
מרחב ליבה
במטרות עסקיות של arm64, אם משתמשים ב-Kleaf כדי ליצור את הליבה, --page_size=16k יוצר את הליבה במצב 16KB.
אם אתם משתמשים ישירות בהגדרות של ליבת Linux, אתם יכולים לבחור דפים בגודל 16KB על ידי הגדרת CONFIG_ARM64_16K_PAGES במקום CONFIG_ARM64_4K_PAGES.
למידע על קבצים בינאריים של GKI גנריים בגודל 16KB, על ענפים נתמכים ועל פרטים לגבי גרסאות וגרסאות חוזרות, אפשר לעיין במאמרים גרסאות GKI בגודל 16KB וגרסאות build להפצה של GKI.
מרחב הפעולה של המשתמש
כדי להפעיל תמיכה בגודל דף של 16KB במרחב המשתמשים של Android, צריך להגדיר את אפשרויות ה-build הבאות במוצר:
-
PRODUCT_NO_BIONIC_PAGE_SIZE_MACRO := trueמסיר את ההגדרה שלPAGE_SIZE, וגורם לרכיבים לקבוע את גודל הדף בזמן הריצה. PRODUCT_MAX_PAGE_SIZE_SUPPORTED := 16384כדי לוודא שקובצי ה-ELF של הפלטפורמה בנויים עם יישור של 16 KB. הגודל הזה גדול מהנדרש כדי לאפשר תאימות בעתיד. עם יישור ELF של 16KB, הליבה יכולה לתמוך בדפים בגודל 4KB או 16KB.
אימות דגלי ה-build
אחרי שבוחרים את היעד lunch, מוודאים שדגלי ה-build מוגדרים כמו שצריך בסביבה:
$ 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 KB. עם זאת, גם אם ה-build עובר, עדיין יכולות להיות בעיות בזמן הריצה בגלל הבדלים בסביבה של 16KB.
תכנות מערכת עם דפים בגודל 16KB
רוב הקוד בכל מכשיר עם Android לא מתייחס ישירות לגודל הדף. עם זאת, בקוד שמתייחס לדפים, התנהגות הקצאת הזיכרון של הליבה משתנה, וצריך לזכור את זה כדי לכתוב קוד שהוא לא רק תואם, אלא גם בעל ביצועים מקסימליים וצורך משאבים מינימליים.
אם קוראים ל-mmap באזור של 1KB, 2KB או עד 4KB במערכת של 4KB, המערכת שומרת 4KB כדי להטמיע את זה. במילים אחרות, כשמבקשים זיכרון מהליבה, הליבה תמיד מעגלת כלפי מעלה את הזיכרון המבוקש לגודל הדף הקרוב ביותר. לדוגמה, אם מקצים אזור של 5 KB באזור של 4 KB, הליבה מקצה 8 KB.
בליבת 16 KB, החלקים הנוספים האלה של הדפים גדולים יותר. לדוגמה, כל ההקצאות האלה, מ-1KB עד 5KB, יקצו 16KB כשהן משמשות עם ליבת 16KB. אם מבקשים 17 KB, המערכת מקצה 32 KB.
לדוגמה, במערכת של 4 KB, אפשר להקצות שני אזורים אנונימיים של 4 KB לקריאה ולכתיבה. לעומת זאת, בליבה של 16KB, הפעולה הזו תגרום להקצאה של שני דפים או 32KB. בליבה של 16 KB, אם אפשר, אפשר לשלב את האזורים האלה לדף אחד שניתן לקריאה או לכתיבה, כך שייעשה שימוש רק ב-16 KB, ויישארו 8 KB לא מנוצלים בהשוואה לליבה של 4 KB. כדי לצמצם עוד יותר את השימוש בזיכרון, אפשר לשלב יותר דפים. למעשה, במערכת של 16KB שעברה אופטימיזציה מקסימלית, דפים של 16KB דורשים פחות זיכרון ממערכות של 4KB, כי טבלת הדפים היא רבע מהגודל של אותו זיכרון.
בכל פעם שמשתמשים ב-mmap, צריך לעגל את הגודל המבוקש לגודל הדף הקרוב ביותר. כך אפשר לוודא שכל כמות הזיכרון שהקרנל מקצה גלויה ישירות למרחב המשתמש בערכי זמן ריצה, במקום להיות מבוקשת באופן מרומז או נגישה באופן מרומז או בטעות.
יצירת ספריות משותפות עם יישור ELF בגודל 16KB
כדי ליצור ספריות משותפות שמהוות חלק מפרויקט Android, ההגדרות הקודמות בקטע הפעלת גודל דף של 16KB מספיקות:
PRODUCT_NO_BIONIC_PAGE_SIZE_MACRO := truePRODUCT_MAX_PAGE_SIZE_SUPPORTED := 16384
כדי ליצור ספריות משותפות שלא נכללות בפרויקט Android, צריך להעביר את דגל המקשר הזה:
-Wl,-z,max-page-size=16384
אימות קובצי הפעלה בינאריים וקובצי prebuilt ליישור ELF בגודל 16 KB
הדרך הכי טובה לוודא שההתאמה וההתנהגות בזמן הריצה תקינות היא לבדוק ולהריץ את הליבה המקומפלת בגודל 16 KB. עם זאת, כדי לזהות בעיות מסוימות בשלב מוקדם יותר:
החל מ-Android 16, אפשר להגדיר את
PRODUCT_CHECK_PREBUILT_MAX_PAGE_SIZE := trueבזמן הבנייה. אפשר להשתמש ב-ignore_max_page_size: trueב-Android.bpוב-LOCAL_IGNORE_MAX_PAGE_SIZE := trueב-Android.mkכדי להתעלם מהם באופן זמני. ההגדרות האלה מאמתות את כל הקבצים שנוצרו מראש ומאפשרות לזהות אם אחד מהם עודכן אבל לא מותאם ל-16KB.אתם יכולים להריץ את
atest elf_alignment_testכדי לאמת את היישור של קובצי ELF במכשירים עם Android מגרסה 15 ואילך.