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