ภาพรวมของ Bootloader

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

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

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

ฟีเจอร์เพิ่มเติมที่เกี่ยวข้องกับบูตโหลดเดอร์

ต่อไปนี้คือรายการฟีเจอร์เพิ่มเติมที่เกี่ยวข้องกับบูตโหลดเดอร์ที่คุณนำไปใช้ได้

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

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

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

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

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

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

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

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

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

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

  • defconfig: เริ่มต้นที่ CONFIG_CMDLINE

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

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