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

יצרני ציוד מקורי רבים של Android משנים את מנהל התקן הליבה של ION מסיבות שונות, כמו הוספת ערימות של ספקים והתאמה אישית של ניהול המטמון (לפרטים על עיינו במאמר שילוב של זיכרון ION הקצאת הרשאות ידנית). כדי לאפשר ליצרני ציוד מקורי: לשמור שינויים כאלה כשמשתמשים בתמונת ליבה גנרית (Kernel) (GKI), Android Common Kernel v5.4 כוללת מסגרת למודולריזציה של ION ספציפית לספק ערימות של נתונים בזמן שנהג הליבה של ION נשאר מובנה. האיור הבא מראה פריסת תמונת ליבה (kernel).

ערימות ION מודולריות

איור 1. מנהל התקן ליבה ION מודולרי של ION

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

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

הטמעה

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

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

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

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

כותרת ה-API של מרחב המשתמשים ION מכילה טיפוס enum ion_heap_id לשימוש ב- הגדרת טווח של מזהי ערימה לשימוש של ערימות (heap) של ספקים.

 /**
 * 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. שפת תרגום ליצור ערימה מותאמת אישית של המערכת, להשתמש במזהה ערימה (heap ID) בטווח המותאם אישית (ION_HEAP_CUSTOM_START עד ION_HEAP_CUSTOM_END) כדי לבצע הקצאות.