PlusMagi's Blog By Pitt Phunsanit Technology U-Boot: หัวใจด่านแรกของการปลุกระบบ Embedded Linux

U-Boot: หัวใจด่านแรกของการปลุกระบบ Embedded Linux

หากคอมพิวเตอร์ทั่วไปมี BIOS/UEFI ทำหน้าที่ตรวจสอบฮาร์ดแวร์และส่งต่อหน้าที่ให้ GRUB โหลดระบบปฏิบัติการ ในโลกของอุปกรณ์สมองกลฝังตัว (Embedded Systems) อย่างเราเตอร์, กล่องรับสัญญาณทีวี, อุปกรณ์ IoT, บอร์ดทดลอง ไปจนถึงเครื่อง NAS ประจำบ้าน บทบาทสำคัญทั้งหมดนี้ถูกรวมไว้ในโปรแกรมขนาดกะทัดรัดตัวเดียวที่ชื่อว่า U-Boot


U-Boot คืออะไร?

U-Boot มีชื่อเต็มว่า Das U-Boot (ย่อมาจาก Universal Boot Loader) เป็นซอฟต์แวร์ Bootloader แบบโอเพนซอร์สภายใต้สัญญาอนุญาต GPL ซึ่งดูแลและพัฒนาโดยชุมชนนักพัฒนา DENX Software Engineering

คำว่า “Universal” ไม่ได้เป็นเพียงการตั้งชื่อเกินจริง แต่สะท้อนความสามารถในการรองรับสถาปัตยกรรม CPU ที่หลากหลายอย่างมาก ตั้งแต่ ARM (ทั้ง 32-bit และ 64-bit), MIPS, RISC-V, PowerPC, x86 ไปจนถึง SuperH ทำให้ U-Boot กลายเป็นมาตรฐานโดยพฤตินัย (De facto standard) สำหรับการบูต Linux บนอุปกรณ์ขนาดเล็กและฮาร์ดแวร์เฉพาะทางทั่วโลก


ลำดับการทำงาน: เมื่อเปิดสวิตช์ไฟ เกิดอะไรขึ้นบ้าง?

ในคอมพิวเตอร์ขนาดเล็กหรือชิป SoC (System on Chip) เมื่อจ่ายไฟเข้าวงจร อุปกรณ์ยังไม่รู้จักระบบปฏิบัติการใดๆ ทั้งสิ้น กระบวนการบูตมักแบ่งออกเป็นลำดับขั้น (Boot Stages) ดังนี้

Plaintext

Plain Text

Plain Text

[Power On] 
   └──> [1. ROM Bootloader (Primary)] ฝังในตัวชิป SoC
          └──> [2. SPL (Secondary Program Loader)] เซ็ตติ้ง RAM พื้นฐาน
                 └──> [3. U-Boot Proper] Bootloader ตัวเต็ม + Command Line
                        └──> [4. OS Kernel (Linux)] รันระบบปฏิบัติการ
  1. Primary Bootloader (ROM)
    รหัสคำสั่งขนาดเล็กที่โรงงานผู้ผลิตชิปเบิร์นฝังไว้ถาวร มีหน้าที่ตรวจหาว่าต้องไปอ่านข้อมูลบูตจากที่ใด (เช่น SPI Flash, eMMC, SD Card หรือ USB)
  2. Secondary Program Loader (SPL / TPL)
    เนื่องจากหน่วยความจำภายในชิป (SRAM) มีพื้นที่จำกัดมาก (มักมีแค่ไม่กี่สิบกิโลไบต์) จึงยังไม่สามารถโหลด U-Boot ตัวเต็มเข้ามาได้ทันที โค้ดของ SPL ขนาดจิ๋วจะถูกดึงมารันก่อนเพื่อ Initialize หน่วยความจำหลัก (DRAM/DDR Controller) ให้พร้อมทำงาน
  3. U-Boot (Full / Proper)
    เมื่อ RAM พร้อมใช้งาน U-Boot ตัวเต็มจะถูกคัดลอกลง RAM เพื่อเริ่มต้นฮาร์ดแวร์ส่วนอื่นๆ เช่น คอนฟิกพอร์ตเครือข่าย, ไดรฟ์จัดเก็บข้อมูล, นาฬิการะบบ และอ่านค่าสภาพแวดล้อม (Environment Variables) เพื่อหาทางบูตเคอร์เนลต่อไป

ฟังก์ชันเด่นที่ทำให้ U-Boot เป็นเครื่องมือโปรดของนักพัฒนา

นอกเหนือจากการโหลด OS ตามปกติแล้ว U-Boot ยังมีสภาพแวดล้อมการทำงานแบบอินเทอร์แอคทีฟ (Interactive Shell) ผ่านพอร์ตสัญญาณอนุกรม (Serial UART) ที่ให้ความยืดหยุ่นสูง

  • การจัดการผ่าน Environment Variables
    สามารถกำหนดลำดับการบูต (Boot sequence) และ Boot Arguments ส่งไปยังเคอร์เนลได้ง่ายผ่านคำสั่ง printenv, setenv และ saveenv
  • บูตและกู้ชีพผ่านเครือข่าย (Network Booting)
    U-Boot มีเน็ตเวิร์กสแต็กในตัว สามารถรับ IP ผ่าน DHCP และดึงไฟล์เคอร์เนลผ่านโปรโตคอล TFTP หรือเมานต์ root filesystem ผ่าน NFS ช่วยให้นักพัฒนาทดสอบเคอร์เนลใหม่ได้ทันทีโดยไม่ต้องแฟลช Flash Memory ซ้ำๆ
  • เข้าถึง Storage ได้โดยตรง
    รองรับการอ่านและเขียนข้อมูลบนสื่อบันทึกเกือบทุกชนิด เช่น คำสั่ง nand, sf (SPI Flash), mmc (SD/eMMC) หรือ usb
  • ระบบความปลอดภัย (Verified Boot)
    รองรับระบบ FIT (Flattened Image Tree) เพื่อตรวจสอบลายเซ็นดิจิทัล (Cryptographic Signatures) ป้องกันไม่ให้เคอร์เนลที่ถูกดัดแปลงหรือแปลกปลอมสามารถบูตขึ้นมาได้

เปรียบเทียบ: U-Boot กับ Bootloader แบบอื่น

คุณสมบัติU-BootUEFI + GRUBCoreboot
เป้าหมายหลักระบบ Embedded, ชิป SoC, อุปกรณ์ IoTพีซีทั่วไป, แล็ปท็อป, เซิร์ฟเวอร์ x86/ARM64เฟิร์มแวร์โอเพนซอร์สสำหรับ PC/Mainboard
สถาปัตยกรรม CPUหลากหลายมาก (ARM, MIPS, RISC-V, etc.)เน้น x86_64, aarch64เน้น x86, ARM บางรุ่น
ขนาดของโค้ดเล็กมาก (หลักร้อย KB ถึงไม่กี่ MB)ใหญ่ (หลักหลายสิบถึงร้อย MB)ขนาดเล็กถึงปานกลาง
การจัดการค่าคอนฟิกKey-Value Text บน Flash (Env block)NVRAM Variables / ไฟล์คอนฟิกข้อความคอมไพล์ฝังค่าลงในรอมโดยตรง

ปราการด่านสำคัญสำหรับสาย Mod และช่างเทคนิค

สำหรับผู้ใช้งานทั่วไป U-Boot อาจทำงานเงียบ ๆ ภายในเสี้ยววินาทีก่อนที่หน้าจอหลักของอุปกรณ์จะสว่างขึ้น แต่สำหรับวิศวกรฝังตัวและผู้ที่ชื่นชอบการปรับแต่งฮาร์ดแวร์ U-Boot คือ “ประตูชุบชีวิต” เมื่ออุปกรณ์เกิดอาการเครื่องค้างหรือบริค (Brick) จากการอัปเดตเฟิร์มแวร์ล้มเหลว ขอเพียง U-Boot ยังไม่เสียหาย การบัดกรีหรือต่อสาย USB-to-TTL UART เพียง 3 เส้น (TX, RX, GND) ก็สามารถเปิดเทอร์มินัลเข้าไปสั่งเขียนเฟิร์มแวร์ใหม่ หรือเปลี่ยนเส้นทางไปรันระบบปฏิบัติการทางเลือกอื่นได้อย่างอิสระ


Exit mobile version