ภาพรวมของ Bootloader

Bootloader คืออิมเมจที่เป็นกรรมสิทธิ์ของผู้ให้บริการซึ่งมีหน้าที่ในการเปิด เคอร์เนลในอุปกรณ์ Bootloader จะปกป้องสถานะของอุปกรณ์และมีหน้าที่ ในการเริ่มต้นสภาพแวดล้อมการดำเนินการที่เชื่อถือได้ (TEE) และเชื่อมโยงรากฐานของความน่าเชื่อถือ นอกจากนี้ Bootloader ยังตรวจสอบความสมบูรณ์ของพาร์ติชัน bootและrecoveryก่อนที่จะย้ายการดำเนินการไปยังเคอร์เนล

ตัวอย่างโฟลว์ของ Bootloader

ตัวอย่างโฟลว์ของ Bootloader มีดังนี้

  1. โหลดและเริ่มต้นหน่วยความจำ

  2. ยืนยันอุปกรณ์ตามขั้นตอนการเปิดเครื่องที่ได้รับการยืนยัน

  3. ยืนยันพาร์ติชันการเปิดเครื่อง ซึ่งรวมถึง boot, dtbo, init_boot และ recovery ตามขั้นตอนการเปิดเครื่องที่ได้รับการยืนยัน ในขั้นตอนนี้ ให้ตรวจสอบเวอร์ชันของ ส่วนหัวของรูปภาพการบูต และแยกวิเคราะห์ส่วนหัวตามนั้น

  4. หากใช้การอัปเดต A/B ให้กำหนดช่องปัจจุบันที่จะ บูต

  5. พิจารณาว่าควรบูตโหมดการกู้คืนหรือไม่ ดูข้อมูลเพิ่มเติมได้ที่การรองรับการอัปเดต OTA

  6. โหลดอิมเมจบูต เช่น boot.img, vendor_boot.img, init_boot.img และอิมเมจบูตของผู้ให้บริการที่เป็นกรรมสิทธิ์อื่นๆ อิมเมจการบูตเหล่านี้ มีอิมเมจเคอร์เนลและ ramdisk

    1. โหลดเคอร์เนลลงในหน่วยความจำเป็นไบนารีที่บีบอัดแล้วและเรียกใช้ได้ด้วยตัวเอง เคอร์เนลจะคลายการบีบอัดตัวเองและเริ่มดำเนินการในหน่วยความจำ

    2. โหลด Ramdisk และส่วน bootconfig ลงในหน่วยความจำ เพื่อสร้าง initramfs

ฟีเจอร์เพิ่มเติมที่เกี่ยวข้องกับ Bootloader

ต่อไปนี้คือรายการฟีเจอร์เพิ่มเติมที่เกี่ยวข้องกับ Bootloader ซึ่งคุณสามารถ นำไปใช้ได้

  • การซ้อนทับแผนผังอุปกรณ์ (DTO) การซ้อนทับ Device Tree ช่วยให้โปรแกรมโหลดระบบปฏิบัติการ รองรับการกำหนดค่าฮาร์ดแวร์ที่แตกต่างกันได้ DTO จะคอมไพล์เป็น device tree blob (DTB) ซึ่งใช้โดย Bootloader

  • การสุ่มที่อยู่เสมือนของอิมเมจเคอร์เนล Bootloader รองรับ การสุ่มที่อยู่เสมือนที่โหลดอิมเมจเคอร์เนล หากต้องการ สุ่มที่อยู่ ให้ตั้งค่า RANDOMIZE_BASE เป็น true ในการกำหนดค่าเคอร์เนล Bootloader ต้องให้เอนโทรปีโดยส่งค่า u64 แบบสุ่มใน /chosen/kaslr-seed โหนด Device Tree

  • การเปิดเครื่องที่ได้รับการยืนยัน การเปิดเครื่องที่ได้รับการยืนยันช่วยให้ โปรแกรมโหลดระบบปฏิบัติการตรวจสอบได้ว่าโค้ดที่เรียกใช้นั้นมาจากแหล่งที่มาที่เชื่อถือได้

  • การกำหนดค่าการบูต การกำหนดค่าการบูต พร้อมใช้งานใน Android 12 ขึ้นไป และเป็นกลไกสำหรับส่ง รายละเอียดการกำหนดค่าจากบิลด์และ Bootloader ไปยังระบบปฏิบัติการ ก่อน Android 12 จะใช้พารามิเตอร์บรรทัดคำสั่งของเคอร์เนลที่มีคำนำหน้า androidboot

  • การอัปเดตผ่านอากาศ (OTA) อุปกรณ์ Android ในภาคสนามสามารถรับและ ติดตั้งการอัปเดต OTA ในระบบ ซอฟต์แวร์แอป และ กฎเขตเวลาได้ ฟีเจอร์นี้มีผลต่อการใช้งาน Bootloader ดูข้อมูลทั่วไปเกี่ยวกับ OTA ได้ที่ การอัปเดต OTA ดูรายละเอียดการติดตั้งใช้งาน OTA เฉพาะ Bootloader ได้ที่ การรองรับการอัปเดต OTA

  • การเชื่อมโยงเวอร์ชัน การเชื่อมโยงเวอร์ชันจะเชื่อมโยง คีย์ความปลอดภัยกับระบบปฏิบัติการและเวอร์ชันระดับแพตช์ การเชื่อมโยงเวอร์ชัน ช่วยให้มั่นใจได้ว่าผู้โจมตีที่ค้นพบจุดอ่อนในระบบเวอร์ชันเก่า หรือซอฟต์แวร์ TEE จะไม่สามารถย้อนเวอร์ชันอุปกรณ์กลับไปเป็นเวอร์ชันที่มีช่องโหว่ และใช้คีย์ที่สร้างด้วยเวอร์ชันใหม่กว่าได้ Bootloader ต้องให้ข้อมูลบางอย่างเพื่อรองรับการเชื่อมโยงเวอร์ชัน ดูข้อมูลเพิ่มเติมได้ที่ ข้อมูลเวอร์ชันในพร็อพเพอร์ตี้ AVB

บรรทัดคำสั่งเคอร์เนล

ต่อบรรทัดคำสั่งเคอร์เนลจากตำแหน่งต่อไปนี้

  • บรรทัดคำสั่งของ Bootloader: ชุดพารามิเตอร์แบบคงที่และแบบไดนามิกที่กำหนดโดย Bootloader

  • แผนผังอุปกรณ์: จากโหนด chosen/bootargs

  • defconfig: จาก CONFIG_CMDLINE

  • boot.img: จากบรรทัดคำสั่ง (ดูออฟเซ็ตและขนาดได้ที่ system/core/mkbootimg/bootimg.h

ตั้งแต่ Android 12 เป็นต้นไป สำหรับพารามิเตอร์ androidboot.* ที่เราต้องส่งไปยังพื้นที่ผู้ใช้ Android เราสามารถใช้ bootconfig แทนบรรทัดคำสั่งของเคอร์เนลได้