ภาพรวมของ Bootloader

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

ตัวอย่างขั้นตอนของ 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. โหลด RAM disk และส่วน bootconfig ลงในหน่วยความจำเพื่อสร้าง initramfs

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

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

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

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

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

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

  • การอัปเดตผ่านอากาศ (OTA) อุปกรณ์ Android ที่ใช้อยู่สามารถรับและติดตั้งการอัปเดต OTA ของระบบ ซอฟต์แวร์แอป และกฎเขตเวลา ฟีเจอร์นี้ส่งผลต่อการใช้งานบูตโหลดเดอร์ ดูข้อมูลทั่วไปเกี่ยวกับ 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