יון ABI שינויים

התקנים המשלוחים ליבה 4.14 ומעלה מושפעים משינוי עיקרי של מודול ליבת ה-Ion , אשר יישומי שכבת אבסטרקציית חומרה (HAL) רבים של ספקים קוראים לו כדי להקצות מאגרי זיכרון משותפים. מאמר זה מספק הנחיות לגבי העברת קוד ספק מדור קודם לגרסה החדשה של Ion ודן בהפסקות עתידיות של ממשק בינארי של יישומים (ABI).

לגבי יון

יון הוא חלק מעץ ההיערכות של הגרעין במעלה הזרם. בזמן ההיערכות, ה-ABI של מרחב המשתמש לקרנל של Ion עשוי להישבר בין גרסאות הליבה העיקריות. בעוד שהפסקות של Ion ABI אינן משפיעות ישירות על יישומים רגילים או על מכשירים שכבר הושקו , ספקים העוברים לגרסאות ליבה עיקריות חדשות עלולים להיתקל בשינויים המשפיעים על קוד הספק המתקשר אל Ion. בנוסף, הפסקות ABI עתידיות עשויות להתרחש כאשר צוות המערכות של אנדרואיד עובד עם במעלה הזרם כדי להזיז את יון מעץ ההיערכות.

שינויים באנדרואיד-4.14

Kernel 4.12 שיחזר בכבדות את קוד ליבת Ion, ניקה והסרה של חלקים של Ion שחפפו למסגרות ליבה אחרות. כתוצאה מכך, Ion ioctls מדור קודם אינם רלוונטיים עוד והוסרו.

הסרת לקוחות יון וידיות

לפני הקרנל 4.12, פתיחת /dev/ion הוקצתה לקוח Ion . ה- ION_IOC_ALLOC ioctl הקצה מאגר חדש והחזיר אותו למרחב המשתמש בתור ידית Ion (מספר שלם אטום בעל משמעות רק ללקוח Ion שהקצה אותו). כדי למפות מאגרים לתוך מרחב המשתמש או לשתף אותם עם תהליכים אחרים, נקודות האחיזה של Ion יוצאו מחדש כ-dma-buf fds באמצעות ioctl ION_IOC_SHARE .

בקרנל 4.12, ה- ION_IOC_ALLOC ioctl מוציא ישירות dma-buf fds. מצב ידית ה-Ion הביניים הוסר, יחד עם כל ה-ioctls שצורכים או מייצרים ידיות יונים. מכיוון ש-dma-buf fds אינם קשורים ללקוחות Ion ספציפיים, אין עוד צורך ב- ION_IOC_SHARE ioctl, וכל תשתית הלקוח של Ion הוסרה.

הוספת ioctls של קוהרנטיות מטמון

לפני ליבה 4.12, יון סיפקה ION_IOC_SYNC ioctl כדי לסנכרן את מתאר הקובץ עם הזיכרון. ioctl זה היה מתועד גרוע ולא גמיש. כתוצאה מכך, ספקים רבים הטמיעו ioctls מותאמים אישית לביצוע תחזוקת מטמון.

ליבה 4.12 החליף ION_IOC_SYNC ב- DMA_BUF_IOCTL_SYNC ioctl שהוגדר ב- linux/dma-buf.h . התקשר DMA_BUF_IOCTL_SYNC בתחילתה ובסופה של כל גישה למעבד, עם דגלים המציינים אם הגישות הללו הן קריאה ו/או כתיבה. למרות DMA_BUF_IOCTL_SYNC מפורט יותר מ- ION_IOC_SYNC , הוא נותן למרחב משתמש יותר שליטה על פעולות תחזוקת המטמון הבסיסיות.

DMA_BUF_IOCTL_SYNC הוא חלק מה-ABI היציב של הליבה והוא שמיש עם כל ה-dma-buf fds, בין אם הם הוקצו על ידי Ion ובין אם לאו.

העברת קוד ספק ל-android-4.12+

עבור לקוחות מרחב משתמש , צוות מערכות אנדרואיד מעודד מאוד להשתמש ב-libion ​​ולא בקריאות ioctl() בקידוד פתוח. החל מאנדרואיד 9, libion ​​מזהה אוטומטית את Ion ABI בזמן ריצה ומנסה להסוות את ההבדלים בין הגרעינים. עם זאת, כל פונקציות ליביון שייצרו או צרכו את ידיות ion_user_handle_t כבר לא פועלות לאחר הקרנל 4.12. אתה יכול להחליף את הפונקציות הללו בפעולות המקבילות הבאות ב-dma-buf fds, שעובדות על כל הגרסאות של הליבה עד היום.

שיחת ion_user_handle_t מדור קודם שיחת dma-buf fd מקבילה
ion_alloc(ion_fd, …, &buf_handle) ion_alloc_fd(ion_fd, ..., &buf_fd)
ion_share(ion_fd, buf_handle, &buf_fd) לא רלוונטי (אין צורך בשיחה זו עם dma-buf fds)
ion_map(ion_fd, buf_handle, ...) mmap(buf_fd, ...)
ion_free(ion_fd, buf_handle) close(buf_fd)
ion_import(ion_fd, buf_fd, &buf_handle) לא רלוונטי (אין צורך בשיחה זו עם dma-buf fds)
ion_sync_fd(ion_fd, buf_fd) If (ion_is_legacy(ion_fd))

ion_sync_fd(ion_fd, buf_fd);

else

ioctl(buf_fd, DMA_BUF_IOCTL_SYNC, ...);

עבור לקוחות בתוך הליבה , מכיוון ש-Ion כבר לא מייצאת ממשקי API הפונים לגרעין, יש להמיר מנהלי התקנים שהשתמשו בעבר בממשק ה-API של ליבת Ion עם ion_import_dma_buf_fd() לשימוש בממשק ה-API של dma-buf בתוך הליבה עם dma_buf_get() .

יון עתידי ABI נשבר

לפני שניתן יהיה להזיז את Ion מעץ ה-Staging, ייתכן שגרסאות ליבה עתידיות יצטרכו לשבור שוב את ה-Ion ABI. צוות מערכות אנדרואיד לא מצפה שהשינויים האלה ישפיעו על מכשירים שיושקו עם גרסת האנדרואיד הבאה, אבל שינויים כאלה עשויים להשפיע על מכשירים שיושקו עם גרסאות אנדרואיד עוקבות.

לדוגמה, הקהילה במעלה הזרם הציעה לפצל את הצומת /dev/ion הבודד למספר צמתים לכל ערמה (למשל, /dev/ion/heap0 ) כדי לאפשר למכשירים להחיל מדיניות SELinux שונה על כל ערמה. אם השינוי הזה מיושם במהדורת ליבה עתידית, זה ישבור את Ion ABI.