ติดตั้งใช้งาน GBL

หน้านี้จะอธิบายวิธีติดตั้งใช้งานไบนารี 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-a50f6c3d9830

    • gbl_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

  1. ตรวจสอบว่าคุณได้ติดตั้งเครื่องมือ Repo และ Bazel Bootstrap แล้ว โดยทำดังนี้

    sudo apt install repo bazel-bootstrap
    
  2. เริ่มต้นไดเรกทอรีปัจจุบันสำหรับการควบคุมซอร์สโค้ดโดยใช้ไฟล์ Manifest 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 ...
    

    คำสั่ง cvd start นี้จะใช้แอป UEFI เพื่อบูต Android แทนการบูต Android โดยตรง

รายงานข้อบกพร่องและติดต่อทีม Bootloader

หากต้องการรายงานข้อบกพร่องสำหรับ GBL ให้ไปที่ คอมโพเนนต์ Android Generic Bootloader ใน Buganizer

หากมีคำถาม โปรดติดต่อทีม GBL โดยส่งอีเมลไปที่ android-gbl@google.com