שמירה על ממשק יציב של מודול הליבה

חשוב מאוד לשמור על ממשק יציב של מודול ליבת המערכת (KMI) עבור מודולים של ספקים. ליבת ה-GKI נוצרת ונשלחת בפורמט בינארי, ומודולים שאפשר לטעון מהספק נוצרים בעץ נפרד. הליבה של GKI ומודולי הספק שמתקבלים צריכים לפעול כאילו הם נוצרו יחד.

באופן כללי, בקהילת Linux לא אהבו את הרעיון של יציבות ABI בתוך הליבה עבור ליבת המיינליין. בגלל כלי שרשרת שונים, תצורות שונות וליבת Linux mainline שמתפתחת כל הזמן, אי אפשר לשמור על KMI יציב ב-mainline. עם זאת, אפשר לשמור על KMI יציב בסביבת GKI עם אילוצים רבים, באמצעות האילוצים הבאים:

  • אפשר להשתמש רק בהגדרה אחת, gki_defconfig, כדי ליצור את ליבת המערכת.

  • ממשק ה-KMI יציב רק באותה גרסת LTS ובאותה גרסת Android של ליבת מערכת ההפעלה, כמו android14-6.1, android15-6.6 או android16-6.12.

    • לא נשמרת יציבות של KMI עבור android-mainline.
  • רק שרשרת הכלים הספציפית של Clang שסופקה ב-AOSP והוגדרה לענף המתאים משמשת לבניית ליבות ומודולים.

  • רק סמלים שידוע שהמודולים משתמשים בהם, כפי שמצוין ברשימת הסמלים, נבדקים מבחינת יציבות ונחשבים לסמלי KMI.

    • מכאן נובע שמודולים של ספקים חייבים להשתמש רק בסמלי KMI. האילוץ הזה נאכף על ידי טעינת מודולים שנכשלה אם נדרשים סמלים שאינם KMI.
  • אחרי שהענף של KMI קפוא, אפשר לבצע שינויים אבל הם לא יכולים לשבור את KMI. מה כלול בשינויים?

    • שינויים בהגדרות
    • שינויים בקוד הליבה
    • שינויים בשרשרת הכלים (כולל עדכונים)

שימוש בתהליך build הרמטי ובערכת הכלים LLVM

תהליך ה-build ההרמטי מבטיח KMI יציב באמצעות מניפסטים של repo ב-kernel/manifest שמתארים באופן מלא את סביבת ה-build. לדוגמה, המאניפסט של android16-6.12 כולל את ערכת הכלים, את מערכת build ואת כל מה שנדרש לבניית ליבת Generic Kernel Image ‏ (GKI). הגדרת ה-build, בעיקר BUILD.bazel, מבטיחה שהכלים הכלולים ישמשו בצורה נכונה ליצירת תוצאות build עקביות.

שימוש בתהליך build הרמטי מבטיח גם שהתיאור של ממשק ABI עבור העץ יהיה עקבי, בין אם הוא נוצר על ידי Google (לדוגמה, gki/aarch64/abi.stg עבור android16-6.12) ובין אם הוא נוצר בעץ מקומי שכולל את מודולי הספק. בנוסף, מאגר המידע שמתואר במניפסט כולל כלים ליצירה ולהשוואה של תיאור ממשק ה-ABI לממשק מודול הליבה (KMI).

שרשרת הכלים שמשמשת לבניית ליבת ה-GKI חייבת להיות תואמת לחלוטין לשרשרת הכלים שמשמשת לבניית מודולים של ספקים. החל מ-Android 10, כל ליבות Android חייבות להיבנות באמצעות ערכת כלים של LLVM. ב-GKI, שרשרת הכלים של LLVM שמשמשת ליצירת ליבות של מוצרים ומודולים של ספקים חייבת ליצור את אותו ABI כמו שרשרת הכלים של LLVM מ-AOSP, והשותפים צריכים לוודא שה-KMI תואם לליבת GKI. מומלץ מאוד להשתמש בכלי הבנייה שסופקו, כי הם מספקים את התאימות הטובה ביותר.

מה השלב הבא?