מודולריזציה של ערימות ION ל-GKI

יצרני ציוד מקורי (OEM) רבים של Android משנים את מנהל הליבה של ION מסיבות שונות, למשל הוספת אשכולות של ספקים והתאמה אישית של ניהול המטמון (פרטים על השינויים האלה מופיעים במאמר שילוב מנהל הזיכרון של ION). כדי לאפשר ליצרני ציוד מקורי לשמור על שינויים כאלה כשהם משתמשים ב-Generic Kernel Image‏ (GKI), ב-Android Common Kernel v5.4 יש מסגרת ליצירת מודולים של ערמות ION ספציפיות לספק, תוך שמירה על מנהל ה-ION הליבה המובנה. בתרשים הבא מוצגת הפריסה של קובץ האימג' של הליבה.

אשכולות ION מודולריים

איור 1. דרייבר ליבה מודולרי של ION

לערמות ION מודולריות יש את היתרונות הבאים.

  • מנהל הליבה של ION יכול להיות חלק מתמונת ה-GKI, וכך כל התיקונים של הבאגים והאופטימיזציות של הביצועים שאינן תלויות במכשיר יהיו זמינים לכל המכשירים.
  • מנהל התקן הליבה ION בליבה המשותפת יכול לטפל ברישום ערימה (heap) ולנהל את הממשק עם מרחב המשתמשים ולקוחות הליבה. המודולים של הזיכרון (heap) של הספק נדרשים רק כדי להטמיע פעולות של הזיכרון (heap) בהתאמה אישית.
  • מנהל הליבה של ION (כחלק מ-GKI) יכול לכלול ווקים למעקב קל יותר אחרי השימוש בזיכרון, דבר שלא היה אפשרי כשלכל יצרן ציוד מקורי הייתה גרסה משלו של מנהל ION.
  • אשכולות ION מודולריים של ספקים אמורים להקל על מעברים עתידיים לאשכולות dmabuf.

הטמעה

מודולים של ION heap יכולים לרשום פעולות dmabuf משלהם כדי לשנות את הפעולות שנרשמו על ידי מנהל ה-ION הליבה. פעולת dmabuf (כמו get_flags()) שלא נתמכת במנהל ה-ION הליבה מחזירה את הערך -EOPNOTSUPP אם להטמעת האשפה חסרים ההחרגות הנדרשות.

כדי לשפר את הביצועים, הנהג dmabuf יכול לבצע תחזוקה חלקית של המטמון (ראו רשימת השינויים). לקוחות הליבה יכולים להשתמש בפונקציות dma_buf_begin_cpu_access_partial ו-dma_buf_end_cpu_access_partial כדי לבצע תחזוקה חלקית של המטמון.

הליבה המשותפת של Android מכילה הטמעות מודולריות של אשכולות המערכת ושל מנהל הזיכרון המרוכז (CMA) לשימוש כחומר עזר ליצירת מודולים של אשכולות.

שינויים בכותרת של ION UAPI

הכותרת של ION user space API‏ (UAPI) מכילה enum של ion_heap_id לשימוש בהגדרת טווח של מזהי אשכול לשימוש באשכולות של ספקים.

 /**
 * ion_heap_id - list of heap IDs that Android can use
 *
 * @ION_HEAP_SYSTEM        ID for the ION_HEAP_TYPE_SYSTEM
 * @ION_HEAP_DMA_START     Start of reserved ID range for heaps of type ION_HEAP_TYPE_DMA
 * @ION_HEAP_DMA_END       End of reserved ID range for heaps of type ION_HEAP_TYPE_DMA
 * @ION_HEAP_CUSTOM_START  Start of reserved ID range for heaps of custom type
 * @ION_HEAP_CUSTOM_END    End of reserved ID range for heaps of custom type
 */

enum ion_heap_id {

   ION_HEAP_SYSTEM = (1 << ION_HEAP_TYPE_SYSTEM),

   ION_HEAP_DMA_START = (ION_HEAP_SYSTEM << 1),

   ION_HEAP_DMA_END = (ION_HEAP_DMA_START << 7),
   ION_HEAP_CUSTOM_START = (ION_HEAP_DMA_END << 1),

   ION_HEAP_CUSTOM_END = (ION_HEAP_CUSTOM_START << 22),
};

בנוסף, IOCTL חדש (ION_IOC_ABI_VERSION) יכול לעזור ללקוחות מרחב המשתמשים לקבוע אם משתמשים בערימות מודולריות.

ביטול של ערימת המערכת הגנרית

ערימת הנתונים של מערכת ION מובנית והיא חלק מהתמונה של GKI, כדי להבטיח שכל תכונה שזקוקה לגישה לערימה (heap) כללית או תלויה במכשיר תלויה בקיומה. לכן, לא ניתן לשנות את מזהה הערימה של ION_HEAP_SYSTEM. כדי ליצור אשכול מערכת בהתאמה אישית, משתמשים במזהה אשכול בטווח בהתאמה אישית (ION_HEAP_CUSTOM_START עד ION_HEAP_CUSTOM_END) כדי לבצע הקצאות.