פריסה של GBL

בדף הזה מוסבר איך לפרוס את קובץ ה-Generic Bootloader (GBL) הבינארי.

הדרישות לגבי קושחת האתחול

כדי להשתמש ב-GBL, קושחת האתחול צריכה לעמוד בדרישות הבאות:

  • תאימות ל-Unified Extensible Firmware Interface‏ (UEFI). הקושחה צריכה להטמיע את פרוטוקולי ה-UEFI הנדרשים ולהשתמש בהם. הקושחה צריכה גם לאפשר הרחבות ספציפיות לספקים באמצעות פרוטוקולי UEFI מוגדרים.

  • אבטחה. הקושחה צריכה ליישם את כל הדרישות של הפעלה מאומתת ב-Android‏ (AVB), כדי לאפשר ל-GBL לאמת תמונות אתחול.

  • מצבי הפעלה. קובץ הבינארי צריך להיות מסוגל לטפל במצבי אתחול שונים, כמו אתחול רגיל, אתחול שחזור וכלי לאתחול מהיר (fastboot).

  • חלוקה דינמית למחיצות. קושחת האתחול צריכה להטמיע לוגיקה של בחירת משבצת כדי לתמוך בקריאה של משבצת האתחול הנכונה מסוג A/B, ולהיות תואמת למחיצות דינמיות ולנתוני משתמשים ב-super.

  • הגדרת מערכת ההפעלה. הקושחה צריכה להיות מסוגלת לשנות את שורת הפקודה של ליבת המערכת, את עץ המכשיר (DTB) ואת bootconfig עם התאמות אישיות של OEM שנדרשות להפעלת המכשיר.

  • מכונה וירטואלית מוגנת בטעינה. הקובץ הבינארי צריך לטעון בצורה נכונה קושחת מכונה וירטואלית מוגנת שאומתה מראש לפני ליבת Android, בנוכחות מכונות וירטואליות מוגנות. מידע נוסף זמין במאמר בנושא רצף האתחול של Microdroid.

  • ניהול זיכרון. קושחת האתחול צריכה לתמוך בממשק ה-API של הקצאת זיכרון UEFI.

דרישות הטמעה

כדי להטמיע את GBL בצורה נכונה במכשיר, אתם צריכים לעמוד בדרישות הבאות:

  • המכשיר צריך להכיל שתי מחיצות FAT בגודל 8 MB (או יותר) בשמות android_esp_a ו-android_esp_b במכשיר לאחסון ולאחזור בלוקים שניתן לגשת אליו על ידי ה-SOC.

    • מכשיר לאחסון ולאחזור בלוקים הוא מכשיר אחסון שאפשר לקרוא ממנו או לכתוב בו ביחידות של בלוקים. דוגמאות: מכשירי UFS,‏ eMMC וכרטיסי SD.
    • משתמשים ב-FAT כי זו מערכת קבצים פשוטה שנמצאת בכל מקום.
    • מומלץ לבחור את מערכת הקבצים FAT שמתאימה לצרכים שלכם מתוך FAT12,‏ FAT16 ו-FAT32.
    • שני המחיצות נדרשות לעדכונים ולהחזרות לגרסה קודמת (rollback) דרך האוויר (OTA) למשך חלון התמיכה של גרסת Android הזו.
    • הגודל של GBL הוא בערך 2 MB לא דחוס. נפח של 8 MB מספיק כדי להביא בחשבון צמיחה אפשרית כתוצאה מתכונות נוספות במהלך שבע השנים הבאות.
    • במקרה של עדכון ב-GBL, צריך לעדכן את כל המחיצה android_esp_${SLOT_SUFFIX}. עדכון GBL בלבד לא נתמך על ידי Android OTA.
    • מזהה ה-GUID של סוג המחיצה שמשמש לשתי מחיצות FAT חייב להתאים למזהה ה-GUID של מחיצת מערכת ה-EFI‏ C12A7328-F81F-11D2-BA4B-00A0C93EC93B.
  • הגרסה של GBL שמוטמעת חייבת להיות ה-build העדכני ביותר של גרסת הייצור המאושרת מענף הגרסה התואם של GBL. מומלץ לחתום על העותק המאושר על ידי Google של GBL באמצעות פתרון החתימה המועדף ולאחסן את ה-build שנוצר ואת המטא-נתונים של החתימה בתוך מחיצת android_esp_${SLOT_SUFFIX}.

    • יצרן הציוד המקורי חייב להשאיר את אישור GBL ללא שינוי, ולא להחיל כותרת על הקובץ הבינארי.
    • גרסת ה-GBL של המפתח משמשת אך ורק למטרות פיתוח וניפוי באגים. אי אפשר לשלוח את הגרסה הזו והיא לא תאושר על ידי Google.
  • צריך לאחסן את קובץ ה-GBL בנתיב /EFI/BOOT/BOOTAA64.EFI במחיצת ה-FAT.

  • כדי לתמוך ב-GBL, צריך להטמיע את פרוטוקולי ה-UEFI ו-Android UEFI הנדרשים. אם הממשקים האלה לא נתמכים, אי אפשר להפעיל את גרסת הייצור של GBL.

    • EFI_BLOCK_IO_PROTOCOL או EFI_BLOCK_IO2_PROTOCOL מאחזר את תמונות האתחול ואת תמונות pvmfw מהדיסק
    • EFI_RNG_PROTOCOL עבור קנריות מחסנית, זרעי KASLR וזרעי RNG
    • שירותים להקצאת זיכרון להקצאת זיכרון זמני לביצוע חישובים של AVB ו-DICE
    • EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL מספקת אפשרות להטמעות ללא פעולה, אבל GBL מתעדת ביומן באמצעות הפרוטוקול הזה כברירת מחדל
    • GBL_EFI_AVB_PROTOCOL accesses public keys and rollback indexes to verify boot images
    • GBL_EFI_BOOT_CONTROL_PROTOCOL מאחזר מטא-נתונים של משבצות וסיבות להפעלה מחדש מהקושחה
    • GBL_EFI_AVF_PROTOCOL יוצר נתוני הגדרה של AVF משרשרת DICE
  • פרוטוקולי ה-UEFI שמומלצים מאוד כשמשלבים את GBL מתועדים במאמר פרוטוקולי GBL UEFI.

תמיכה בקושחה של אתחול

אחרי ביצוע השינויים הנדרשים כדי לתמוך בדרישות שצוינו בקטע הקודם, הטמעות הקושחה הבאות של UEFI פועלות עם GBL:

  • EDK2 (Tianocore). EDK2 היא הטמעה פופולרית של UEFI בקוד פתוח. נדרשת תמיכה ב-GBL עבור טועני אתחול (bootloaders) שמבוססים על EDK2, ותמיכה ב-UEFI כבר קיימת.
  • U-Boot. פרויקט גמיש ופופולרי של טוען אתחול בקוד פתוח, שמתחילה להיות לו תאימות ל-UEFI לשימוש ב-GBL.
  • LittleKernel‏ (LK). טוען אתחול (bootloader) בקוד פתוח שמשמש חלק מהספקים.

הפעלת GBL

אתם יכולים להשיג קובץ בינארי של GBL שמוכן להפעלה, או לבנות קובץ משלכם ולהפעיל אותו.

השגת קובץ GBL בינארי והרצתו

‫GBL מופץ כקובץ בינארי יחיד של אפליקציית UEFI. אפשר לעדכן את הקובץ הבינארי הזה בנפרד מהקושחה הבסיסית של המכשיר באמצעות מנגנון העדכון הרגיל של Android.

החל מ-Android 16, אם אתם שולחים מכשיר שמבוסס על ערכת שבבים ARM-64, מומלץ מאוד לפרוס את הגרסה העדכנית ביותר שאושרה על ידי Google של GBL ולשלב אותה בשרשרת האתחול.

Build GBL

כדי ליצור GBL:

  1. מוודאים שכלי ה-repo ו-Bazel bootstrap מותקנים:

    sudo apt install repo bazel-bootstrap
    
  2. מאתחלים את הספרייה הנוכחית לבקרת מקור באמצעות קובץ המניפסט uefi-gbl-mainline:

    repo init -u https://android.googlesource.com/kernel/manifest -b uefi-gbl-mainline
    repo sync -j16
    
  3. יוצרים את אפליקציית UEFI:

    tools/bazel run //bootable/libbootloader:gbl_efi_dist
    

בדיקת GBL במכשיר וירטואלי של Android

  1. מריצים את GBL בתוך Cuttlefish:

    cvd start --android_efi_loader=path_to_the_UEFI_app ...
    

    במקום להפעיל את Android ישירות, הפקודה cvd start הזו משתמשת באפליקציית UEFI כדי להפעיל את Android.

דיווח על באגים ויצירת קשר עם צוות Bootloader

כדי לדווח על באג ב-GBL, עוברים אל רכיב Android Generic Bootloader ב-Buganizer.

אם יש לך שאלות, אפשר לפנות לצוות GBL באימייל לכתובת android-gbl@google.com.