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

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