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