หน้านี้จะอธิบายวิธีติดตั้งใช้งานไบนารี Generic Bootloader (GBL)
ข้อกำหนดของเฟิร์มแวร์บูต
หากต้องการใช้ GBL เฟิร์มแวร์บูตต้องเป็นไปตามข้อกำหนดต่อไปนี้
เป็นไปตามข้อกำหนดของ Unified Extensible Firmware Interface (UEFI) เฟิร์มแวร์ต้องใช้โปรโตคอล UEFI ที่จำเป็น นอกจากนี้ เฟิร์มแวร์ยังต้องอนุญาตให้ใช้ส่วนขยายเฉพาะของผู้ให้บริการโดยใช้โปรโตคอล UEFI ที่กำหนด
ความปลอดภัย เฟิร์มแวร์ต้องใช้ข้อกำหนดทั้งหมดสำหรับ Android การเปิดเครื่องที่ได้รับการยืนยัน (AVB) เพื่อให้ GBL สามารถตรวจสอบสิทธิ์อิมเมจบูตได้
โหมดการเปิดเครื่อง ไบนารีควรจัดการโหมดการเปิดเครื่องต่างๆ ได้ เช่น การเปิดเครื่องตามปกติ การเปิดเครื่องเพื่อกู้คืน และ Fastboot
การแบ่งพาร์ติชันแบบไดนามิก เฟิร์มแวร์บูตต้องใช้ตรรกะการเลือกสล็อตเพื่อให้รองรับการอ่านสล็อตบูต A/B ที่ถูกต้อง และเข้ากันได้กับการแบ่งพาร์ติชันแบบไดนามิกและข้อมูลผู้ใช้ใน Super
การกำหนดค่าระบบปฏิบัติการ เฟิร์มแวร์ต้องมีความสามารถในการแก้ไขบรรทัดคำสั่งเคอร์เนล, แผนผังอุปกรณ์ (DTB) และ Bootconfig ด้วยการปรับแต่ง OEM ที่จำเป็นในการบูตอุปกรณ์
การโหลด VM ที่ได้รับการปกป้อง ไบนารีควรโหลดเฟิร์มแวร์ VM ที่ได้รับการปกป้องซึ่งได้รับการยืนยันล่วงหน้าอย่างถูกต้องก่อนเคอร์เนล Android ในกรณีที่มี VM ที่ได้รับการปกป้อง ดูข้อมูลเพิ่มเติมได้ที่ ลำดับการบูตของ Microdroid
การจัดการหน่วยความจำ เฟิร์มแวร์บูตต้องรองรับ API การจัดสรรหน่วยความจำ UEFI
ข้อกำหนดในการใช้งาน
คุณต้องมีคุณสมบัติตรงตามข้อกำหนดต่อไปนี้เพื่อให้ GBL ทำงานได้อย่างถูกต้องในอุปกรณ์
อุปกรณ์ต้องมีพาร์ติชัน FAT 2 พาร์ติชันที่มีขนาด 8 MB (หรือใหญ่กว่า) ชื่อ
android_esp_aและandroid_esp_bในอุปกรณ์บล็อกที่ SOC เข้าถึงได้- อุปกรณ์บล็อกคืออุปกรณ์เก็บข้อมูลที่อ่านหรือเขียนได้ในหน่วยบล็อก เช่น อุปกรณ์ UFS, eMMC และการ์ด SD
- เราใช้ FAT เนื่องจากเป็นระบบไฟล์ที่แพร่หลายและตรงไปตรงมา
- เราขอแนะนำให้คุณเลือกระบบไฟล์ FAT ที่เหมาะกับความต้องการจาก FAT12, FAT16 และ FAT32
- คุณต้องมีทั้ง 2 พาร์ติชันสำหรับการอัปเดตและการย้อนกลับแบบ Over-the-Air (OTA) ตลอดระยะเวลาที่ Android เวอร์ชันนี้ได้รับการสนับสนุน
- GBL มีขนาดประมาณ 2 MB เมื่อขยายการบีบอัด 8 MB เพียงพอต่อการเติบโตที่อาจเกิดขึ้นเนื่องจากฟีเจอร์เพิ่มเติมในช่วง 7 ปีข้างหน้า
- ในกรณีที่มีการอัปเดต GBL คุณต้องอัปเดตพาร์ติชัน
android_esp_${SLOT_SUFFIX}ทั้งหมด Android OTA ไม่รองรับการอัปเดต GBL เท่านั้น - GUID ประเภทพาร์ติชันที่ใช้กับพาร์ติชัน FAT ทั้ง 2 พาร์ติชันต้องสอดคล้องกับ GUID พาร์ติชันระบบ EFI
C12A7328-F81F-11D2-BA4B-00A0C93EC93B
เวอร์ชัน GBL ที่ทำให้ใช้งานได้ต้องเป็นบิลด์เวอร์ชันที่ใช้งานจริงล่าสุดที่ผ่านการรับรองแล้วจาก Branch การเผยแพร่ GBL ที่เกี่ยวข้อง เราขอแนะนำให้คุณลงนามสำเนา GBL ที่ผ่านการรับรองจาก Google โดยใช้โซลูชันการลงนามที่คุณต้องการ และจัดเก็บข้อมูลเมตาของบิลด์และลายเซ็นที่ได้ภายในพาร์ติชัน
android_esp_${SLOT_SUFFIX}- OEM Signature ต้องไม่เปลี่ยนแปลงใบรับรอง 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_GUIDเป็น5a6d92f3-a2d0-4083-91a1-a50f6c3d9830gbl_fw_api_levelต้องตั้งค่าเป็นระดับ API ของเฟิร์มแวร์แพลตฟอร์ม ซึ่งระบุระดับ API ของซอฟต์แวร์ของผู้ให้บริการ ตัวแปรนี้ต้องมีค่าเดียวกับพร็อพเพอร์ตี้ระบบro.board.api_level
โปรโตคอล UEFI ที่เราขอแนะนำอย่างยิ่งเมื่อผสานรวม GBL มี อธิบายไว้ใน โปรโตคอล GBL UEFI
การรองรับเฟิร์มแวร์บูต
การใช้งานเฟิร์มแวร์ UEFI ต่อไปนี้จะทำงานร่วมกับ GBL ได้เมื่อมีการแก้ไขที่จำเป็นเพื่อรองรับข้อกำหนดในส่วนก่อนหน้า
- EDK2 (Tianocore). EDK2 เป็นการใช้งาน UEFI แบบโอเพนซอร์สที่ได้รับความนิยม จำเป็นต้องมีการรองรับ GBL สำหรับ Bootloader ที่ใช้ EDK2 และมีการรองรับ UEFI อยู่แล้ว
- U-Boot. โปรเจ็กต์ Bootloader แบบโอเพนซอร์สที่ยืดหยุ่นและใช้กันอย่างแพร่หลาย ซึ่งกำลังได้รับความเข้ากันได้กับ UEFI สำหรับการใช้งาน GBL
- LittleKernel (LK) Bootloader แบบโอเพนซอร์สที่ผู้ให้บริการบางรายใช้
เรียกใช้ GBL
คุณสามารถรับไบนารี GBL ที่สร้างไว้ล่วงหน้าเพื่อเรียกใช้ หรือสร้างไบนารีของคุณเองแล้วเรียกใช้
รับและเรียกใช้ไบนารี GBL
GBL จะเผยแพร่เป็นไบนารีแอป UEFI เดียว คุณสามารถอัปเดตไบนารีนี้แยกจากเฟิร์มแวร์ฐานของอุปกรณ์ได้โดยใช้กลไกการอัปเดตมาตรฐานของ Android
ตั้งแต่ Android 16 เป็นต้นไป หากคุณจัดส่งอุปกรณ์ที่ใช้ชิปเซ็ต ARM-64 เราขอแนะนำอย่างยิ่งให้คุณติดตั้งใช้งาน GBL เวอร์ชันล่าสุด ที่ผ่านการรับรองจาก Google และผสานรวมเข้ากับห่วงโซ่การบูต
สร้าง GBL
วิธีสร้าง GBL
ตรวจสอบว่าคุณได้ติดตั้งเครื่องมือ Repo และ Bazel Bootstrap แล้ว โดยทำดังนี้
sudo apt install repo bazel-bootstrapเริ่มต้นไดเรกทอรีปัจจุบันสำหรับการควบคุมซอร์สโค้ดโดยใช้ไฟล์ Manifest
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 ...คำสั่ง
cvd startนี้จะใช้แอป UEFI เพื่อบูต Android แทนการบูต Android โดยตรง
รายงานข้อบกพร่องและติดต่อทีม Bootloader
หากต้องการรายงานข้อบกพร่องสำหรับ GBL ให้ไปที่ คอมโพเนนต์ Android Generic Bootloader ใน Buganizer
หากมีคำถาม โปรดติดต่อทีม GBL โดยส่งอีเมลไปที่ android-gbl@google.com