ภาพรวมของ 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 ที่คุณสามารถนำไปใช้ได้

  • Device Tree Overlay (DTO) Device Tree Overlay ช่วยให้ Bootloader รองรับการกำหนดค่าฮาร์ดแวร์ที่แตกต่างกัน DTO จะคอมไพล์เป็น Device Tree Blob (DTB) ซึ่ง Bootloader ใช้

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

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

  • การกำหนดค่าการบูต การกำหนดค่าการบูต มีให้บริการใน 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 แทน บรรทัดคำสั่งเคอร์เนลได้