בדף הזה מוסבר איך פורסים את קובץ ה-GBL (Generic Bootloader) הבינארי.
הדרישות לגבי קושחת האתחול
כדי להשתמש ב-GBL, קושחת האתחול צריכה לעמוד בדרישות הבאות:
תאימות ל-Unified Extensible Firmware Interface (UEFI). הקושחה צריכה להטמיע את פרוטוקולי ה-UEFI הנדרשים ולהשתמש בהם. הקושחה צריכה גם לאפשר תוספים ספציפיים לספקים באמצעות פרוטוקולי UEFI מוגדרים.
אבטחה. הקושחה צריכה ליישם את כל הדרישות של Android Verified Boot (AVB), כדי לאפשר ל-GBL לאמת תמונות אתחול.
מצבי הפעלה. קובץ הבינארי צריך להיות מסוגל לטפל במצבי אתחול שונים, כמו אתחול רגיל, אתחול לשחזור ואתחול מהיר.
חלוקה דינמית למחיצות. קושחת האתחול צריכה להטמיע לוגיקה של בחירת משבצת כדי לתמוך בקריאת משבצת האתחול הנכונה של 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 שמוטמעת חייבת להיות הגרסה העדכנית ביותר של גרסת הייצור המאושרת מענף הגרסה המתאים של GBL. מומלץ לחתום על העותק המאושר על ידי Google של GBL באמצעות פתרון החתימה המועדף עליך, ולאחסן את ה-build שנוצר ואת המטא-נתונים של החתימה בתוך מחיצת
android_esp_${SLOT_SUFFIX}.- יצרן הציוד המקורי חייב להשאיר את אישור GBL ללא שינוי, ולא להוסיף כותרת לקובץ הבינארי.
- הגרסה של GBL למפתחים משמשת אך ורק למטרות פיתוח וניפוי באגים. אי אפשר לשלוח את הגרסה הזו והיא לא תאושר על ידי Google.
צריך לאחסן את קובץ ה-GBL בנתיב
/EFI/BOOT/BOOTAA64.EFIבמחיצת FAT.צריך להטמיע את פרוטוקולי UEFI ו-Android UEFI הנדרשים כדי לתמוך ב-GBL. אם הממשקים האלה לא נתמכים, בניית הייצור של GBL לא מצליחה לאתחל.
-
EFI_BLOCK_IO_PROTOCOLאוEFI_BLOCK_IO2_PROTOCOLמאחזר את תמונות האתחול ואת תמונות pvmfw מהדיסק -
EFI_RNG_PROTOCOLעבור stack canaries, KASLR seeds ו-RNG seeds - שירותים להקצאת זיכרון להקצאת זיכרון זמני לביצוע חישובים של AVB ו-DICE
-
EFI_SIMPLE_TEXT_OUTPUT_PROTOCOLמספק אפשרות להטמעות ללא פעולה, אבל GBL מתעד דרך הפרוטוקול הזה כברירת מחדל -
GBL_EFI_AVB_PROTOCOLניגש למפתחות ציבוריים ולמדדי חזרה כדי לאמת תמונות אתחול -
GBL_EFI_BOOT_CONTROL_PROTOCOLמקבל מטא-נתונים של משבצות וסיבות לאתחול מהקושחה -
GBL_EFI_AVF_PROTOCOLיוצר נתוני הגדרה של AVF משרשרת DICE
-
הקושחה צריכה לספק משתני UEFI ל-GBL. חובה להגדיר את המשתנים האלה עם הערך
GBL_EFI_VENDOR_GUID5a6d92f3-a2d0-4083-91a1-a50f6c3d9830.gbl_fw_api_levelצריך להיות מוגדר לרמת ה-API של קושחת הפלטפורמה, שמציינת את רמת ה-API של תוכנת הספק. הערך של המשתנה הזה צריך להיות זהה לערך של מאפיין המערכתro.board.api_level.
פרוטוקולי ה-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 ולשלב אותה בשרשרת האתחול.
יצירת GBL
כדי ליצור GBL:
מוודאים שכלי ה-repo ו-Bazel bootstrap מותקנים:
sudo apt install repo bazel-bootstrapמאתחלים את הספרייה הנוכחית לבקרת מקור באמצעות קובץ המניפסט
uefi-gbl-mainline:repo init -u https://android.googlesource.com/kernel/manifest -b uefi-gbl-mainline repo sync -j16יוצרים את אפליקציית ה-UEFI:
tools/bazel run //bootable/libbootloader:gbl_efi_dist
בדיקת GBL במכשיר וירטואלי של Android
מריצים את GBL בתוך Cuttlefish:
cvd start --android_efi_loader=path_to_the_UEFI_app ...במקום להפעיל את Android ישירות, הפקודה
cvd startהזו משתמשת באפליקציית UEFI כדי להפעיל את Android.
דיווח על באגים ויצירת קשר עם צוות טוען האתחול
כדי לדווח על באג ב-GBL, עוברים אל רכיב Android Generic Bootloader ב-Buganizer.
אם יש לך שאלות, אפשר לפנות לצוות GBL באימייל לכתובת android-gbl@google.com.