การใช้งาน Android อาจมีอิมเมจ Device Tree 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 ที่ต่อกัน Bootloader ใช้ฟิลด์
totalsizeในส่วนหัว FDT แต่ละรายการเพื่ออ่านและแยกวิเคราะห์ Blob ที่เกี่ยวข้องพาร์ติชัน DTB/DTBO Bootloader มีวิธีที่มีประสิทธิภาพในการเลือก DT Blob ที่ถูกต้องโดยการตรวจสอบโครงสร้าง
dt_table_entry(มีฟิลด์id,revและcustom) ซึ่งสามารถเก็บข้อมูลระบุฮาร์ดแวร์สำหรับรายการได้ โปรดดูรายละเอียดที่พาร์ติชัน DTB/DTBO
รวมอิมเมจ DTB ไว้ในอิมเมจบูต
อุปกรณ์ที่ใช้ Android 10 สามารถรวมอิมเมจ DTB ไว้ในอิมเมจบูตได้ ซึ่งจะช่วยให้ Android ไม่จำเป็นต้องรองรับสคริปต์ที่ผนวกรูปภาพ DTB เข้ากับ image.gz ในเคอร์เนล และช่วยให้ใช้การทดสอบ Vendor Test
Suite (VTS) เพื่อยืนยัน (และกำหนดมาตรฐาน) การวาง DTB ได้
นอกจากนี้ สำหรับอุปกรณ์ที่ไม่ใช่ A/B การมี DTB เป็นส่วนหนึ่งของอิมเมจการกู้คืนจะปลอดภัยกว่าการมี DTB ในพาร์ติชันแยกต่างหากเพื่อป้องกันปัญหาที่เกิดจาก OTA ที่ถูกขัดจังหวะ ในระหว่าง OTA หากเกิดปัญหาหลังจากอัปเดตพาร์ติชัน DTB (แต่ก่อนที่จะอัปเดตทั้งหมดเสร็จสมบูรณ์) อุปกรณ์จะพยายามบูตเข้าสู่ โหมดการกู้คืนเพื่อทำ OTA ให้เสร็จสมบูรณ์ อย่างไรก็ตาม เนื่องจากพาร์ติชัน DTB ได้รับการอัปเดตแล้ว จึงอาจเกิดความไม่ตรงกันกับอิมเมจการกู้คืน (ซึ่งยังไม่ได้อัปเดต) การมีอิมเมจ DTB เป็นส่วนหนึ่งของรูปแบบอิมเมจบูตจะช่วยป้องกันปัญหาดังกล่าวด้วยการทำให้อิมเมจการกู้คืนทำงานได้ด้วยตัวเอง (กล่าวคือ ไม่ได้ขึ้นอยู่กับพาร์ติชันอื่น)
โครงสร้างอิมเมจบูต
อุปกรณ์ที่ใช้ Android 10 สามารถรวมอิมเมจ DTB โดยใช้โครงสร้างอิมเมจบูตต่อไปนี้
| ส่วนอิมเมจบูต | จำนวนหน้า |
|---|---|
| ส่วนหัวของการบูต (1 หน้า) | 1 |
| เคอร์เนล (1 หน้า) | l = (kernel_size + page_size -
1) / page_size |
| Ramdisk (m pages) | m = (ramdisk_size + page_size -
1) / page_size |
| Bootloader ระยะที่ 2 (n หน้า) | n = (second_size + page_size -
1) / page_size |
| DTBO การกู้คืน (o หน้า) | o = (recovery_dtbo_size + page_size -
1) / page_size |
| DTB (หน้า p) | 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 หากมีไฟล์มากกว่า 1 ไฟล์ที่มีนามสกุล *.dtb ในไดเรกทอรี BOARD_PREBUILT_DTBIMAGE_DIR ระบบบิลด์ของ 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)
การรองรับ Bootloader
หากต้องการให้ VTS ทำงานในอุปกรณ์ที่ใช้ Android 10 ได้สำเร็จ Bootloader ต้องรองรับอิมเมจบูตที่อัปเดตแล้ว และต้องเพิ่มพารามิเตอร์บรรทัดคำสั่งเคอร์เนล androidboot.dtb_idx เพื่อระบุดัชนีของแผนผังอุปกรณ์ (DT) ที่เลือก คุณระบุได้เพียง 1 ดัชนี เช่น พารามิเตอร์ androidboot.dtb_idx=N reports N เป็นดัชนีแบบอิงตาม 0 ของแผนผังอุปกรณ์ที่ Bootloader เลือกจากชุด DTB ที่อยู่ในอิมเมจบูต