הטמעות של Android יכולות לכלול תמונת blob של עץ מכשירים (DTB) לשימוש על ידי טוען האתחול. המיקום של תמונת ה-DTB (והאפשרויות לציון פרמטרים של תמונת ה-DTB) שונה בין גרסאות Android.
ב-Android 11, מכשירים שמשתמשים ב-Generic Kernel Image (GKI) חייבים לתמוך במחיצת האתחול של הספק, שכוללת את כל המידע הספציפי לספק שהועבר ממחיצת האתחול. תמונת ה-DTB מכילה נתונים ספציפיים לספק, ולכן היא עכשיו חלק ממחיצת האתחול של הספק. כדי לציין פרמטרים של תמונת DTB, אפשר לעיין בכותרת של אתחול ספק.
ב-Android 10, מכשירים יכולים לכלול את תמונת ה-DTB במחיצת האתחול. כדי לציין פרמטרים של תמונת DTB, אפשר לעיין במאמר הכללת תמונת DTB בתמונת האתחול.
ב-Android מגרסה 9 ומטה, תמונת ה-DTB יכולה להיות במחיצה משלה או מצורפת לליבת
image.gz
כדי ליצור את תמונת הליבה + DTB (שמועברת ל-mkbootimg
כדי ליצור אתboot.img
).
פורמט תמונה של DTB
ב-Android מגרסה 10 ואילך, תמונת ה-DTB צריכה להיות באחד מהפורמטים הבאים:
בלובים של DT שמשורשרים אחד אחרי השני. טוען האתחול משתמש בשדה
totalsize
בכל כותרת FDT כדי לקרוא ולנתח את ה-blob המתאים.מחיצות DTB/DTBO. ל-bootloader יש דרך יעילה לבחור את ה-blob הנכון של ה-DT על ידי בדיקת המבנה
dt_table_entry
(מכיל את השדותid
,rev
ו-custom
) שיכול להכיל מידע לזיהוי חומרה עבור הרשומה. פרטים נוספים זמינים במאמר בנושא מחיצות DTB/DTBO.
הכללת תמונת ה-DTB בתמונת האתחול
במכשירים עם Android 10 אפשר לכלול את קובץ ה-DTB בתמונת האתחול. כך אין צורך ש-Android יתמוך בסקריפטים שמצרפים את תמונת ה-DTB אל image.gz
בקרנל, ואפשר להשתמש בבדיקה Vendor Test Suite (VTS) כדי לאמת (ולתקנן) את המיקום של ה-DTB.
בנוסף, במכשירים שאינם A/B, עדיף ש-DTB יהיה חלק מתמונת השחזור ולא במחיצה נפרדת, כדי למנוע בעיות שנגרמות כתוצאה מהפסקות ב-OTA. במהלך עדכון OTA, אם מתרחשת בעיה אחרי העדכון של מחיצת DTB (אבל לפני השלמת העדכון המלא), המכשיר מנסה לבצע אתחול למצב שחזור כדי להשלים את עדכון ה-OTA. עם זאת, מכיוון שמחיצת DTB כבר עודכנה, יכול להיות שיהיה חוסר התאמה עם תמונת השחזור (שעדיין לא עודכנה). הכללת תמונת ה-DTB כחלק מפורמט תמונת האתחול מונעת בעיות כאלה, כי היא מאפשרת לתמונת השחזור להיות עצמאית (כלומר, היא לא תלויה במחיצה אחרת).
המבנה של קובץ אימג' לאתחול
מכשירים עם Android 10 יכולים לכלול קובץ אימג' של DTB באמצעות המבנה הבא של קובץ אימג' לאתחול.
הקטע 'קובץ אימג' לאתחול' | מספר הדפים |
---|---|
כותרת אתחול (דף אחד) | 1 |
Kernel (l pages) | l = (kernel_size + page_size – 1) / page_size |
Ramdisk (m pages) | m = (ramdisk_size + page_size -
1) / page_size |
תוכנת אתחול שלב שני (n דפים) | n = (second_size + page_size –
1) / page_size |
Recovery DTBO (o pages) | o = (recovery_dtbo_size + page_size -
1) / page_size |
DTB (דפים) | p = (dtb_size + page_size -
1) / page_size |
נתיב לתמונת DTB
במכשירים עם Android 10, אפשר להשתמש בכלי mkbootimg.py
ובארגומנטים הבאים כדי לציין את הנתיב לתמונה של DTB.
ארגומנט | תיאור |
---|---|
dtb |
הנתיב לתמונת ה-DTB שצריך לכלול בתמונות האתחול או השחזור. |
dtb_offset |
כשמוסיפים אותו לארגומנט base , הוא מספק את כתובת הטעינה הפיזית של עץ המכשיר הסופי. לדוגמה, אם הארגומנט base הוא 0x10000000 והארגומנט dtb_offset הוא 0x01000000 , הערך dtb_addr_field בכותרת של תמונת האתחול יאוכלס כ-0x11000000 . |
צריך להשתמש במשתנה התצורה של הלוח BOARD_PREBUILT_DTBIMAGE_DIR
כדי לציין את הנתיב לתמונת ה-DTB. אם יש יותר מקובץ אחד עם הסיומת *.dtb
בספרייה BOARD_PREBUILT_DTBIMAGE_DIR
, מערכת ה-build של Android משרשרת את הקבצים כדי ליצור את תמונת ה-DTB הסופית שמשמשת ליצירת תמונת האתחול.
כדי להעביר את הארגומנט dtb
אל mkbootimg.py
עם קובץ האימג' של DTB מהספרייה שצוינה על ידי BOARD_PREBUILT_DTBIMAGE_DIR
, צריך להגדיר את משתנה התצורה של הלוח BOARD_INCLUDE_DTB_IN_BOOTIMG
לערך true
. לדוגמה:
BOARD_INCLUDE_DTB_IN_BOOTIMG := true
אפשר להוסיף את הארגומנט dtb_offset
למשתנה BOARD_MKBOOTIMG_ARGS
board config עם ההיסטים האחרים וגרסת הכותרת. לדוגמה:
BOARD_MKBOOTIMG_ARGS := --ramdisk_offset $(BOARD_RAMDISK_OFFSET) --dtb_offset $(BOARD_DTB_OFFSET) --tags_offset $(BOARD_KERNEL_TAGS_OFFSET) --header_version $(BOARD_BOOTIMG_HEADER_VERSION)
תמיכה בתוכנת אתחול
כדי ש-VTS יפעל בהצלחה במכשירים עם Android 10, טוען האתחול צריך לתמוך בתמונת האתחול המעודכנת, וצריך להוסיף את פרמטר שורת הפקודה של ליבת androidboot.dtb_idx
כדי לציין את האינדקס של עץ המכשיר (DT) שנבחר. אפשר לציין רק אינדקס אחד (1). לדוגמה, הפרמטר androidboot.dtb_idx=N
מחזיר את הערך N
בתור האינדקס מבוסס-האפס של עץ המכשירים שנבחר על ידי טוען האתחול מתוך קבוצת ה-DTB שקיימים בתמונת האתחול.