יצרני OEM רבים של אנדרואיד משנים את מנהל ההתקן של ליבת ION מסיבות שונות, כגון הוספת ערימות של ספקים והתאמה אישית של ניהול מטמון (לפרטים על שינויים אלה, עיין בשילוב מקצי הזיכרון של ION ). כדי לאפשר ליצרני ציוד מקורי לשמור שינויים כאלה בעת שימוש בתמונת הליבה הגנרית (GKI) , Android Common Kernel v5.4 מציג מסגרת למודולריזציה של ערימות ION ספציפיות לספק תוך שמירה על מנהל ההתקן הליבה ION מובנה. האיור הבא מציג את פריסת תמונת הליבה .
איור 1. מנהל התקן ליבת ION מודולרי
לערמות ION מודולריות יש את היתרונות הבאים.
- מנהל ההתקן הליבה של ION יכול להיות חלק מתמונת GKI, מה שמאפשר לכל אופטימיזציית ביצועים ותיקוני באגים בלתי תלויים במכשיר להגיע לכל המכשירים.
- מנהל ההתקן של ליבת ION בקרנל המשותף יכול לטפל ברישום ערימה ולנהל את הממשק למרחב המשתמש וללקוחות הקרנל. מודולי הערימה של הספק נדרשים רק כדי ליישם את פעולות הערימה המותאמות אישית.
- מנהל ההתקן הליבה של ION (כחלק מה-GKI) יכול לכלול ווים למעקב קל יותר אחר שימוש בזיכרון, דבר שלא היה אפשרי כאשר לכל OEM הייתה גרסה משלו של מנהל ההתקן ION.
- ערימות ION של ספקים מודולריים אמורות להקל על כל מעבר עתידי ל-
dmabuf
heaps.
יישום
מודולי ערימת ION יכולים לרשום פעולות dmabuf
משלהם כדי לעקוף את אלו שנרשמו על ידי מנהל ההתקן ION הליבה. פעולת dmabuf
(כגון get_flags()
) שאינה נתמכת על ידי מנהל ההתקן של ION הליבה מחזירה -EOPNOTSUPP
אם ליישום הערימה חסרות הדרישות הנדרשות.
כדי לשפר את הביצועים, מנהל ההתקן dmabuf
יכול לבצע תחזוקה חלקית של מטמון (ראה רשימת שינויים ). לקוחות ליבה יכולים להשתמש בפונקציות dma_buf_begin_cpu_access_partial
ו- dma_buf_end_cpu_access_partial
כדי לבצע תחזוקה חלקית של מטמון.
ה-Android Common Kernel מכיל יישומים מודולריים של המערכת וערימות של מקצי זיכרון רציף (CMA) לשימוש כהתייחסות למודולריזציה של ערמות.
שינויים בכותרת ION UAPI
הכותרת של ION user space API (UAPI) מכילה תפריט 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 כדי להבטיח שכל תכונה שצריכה גישה לערמה גנרית/בלתי תלויה במכשיר יכולה להיות תלויה בקיומה. ככזה, אינך יכול לעקוף את מזהה הערימה של ION_HEAP_SYSTEM
. כדי ליצור ערימת מערכת מותאמת אישית, השתמש במזהה ערימה בטווח המותאם אישית ( ION_HEAP_CUSTOM_START
עד ION_HEAP_CUSTOM_END
) כדי לבצע הקצאות.