> For the complete documentation index, see [llms.txt](https://docs.aic-eec.com/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.aic-eec.com/computer-operation-systems/zero-to-linux-hero/anatomy-of-embedded-linux/bootloader.md).

# Bootloader

bootloader เป็นส่วนสำคัญอีกส่วนหนึ่งของระบบสมองกลฝังตัวที่มีหน้าที่ในการเตรียมการให้ระบบฮาร์ดแวร์พื้นฐาน (Hardware Initialization) เช่น หน่วยประมวลผลกลาง (CPU) หน่วยความจำ (DRAM) และ MMC Controller ให้พร้อมที่จะทำงานได้ ในขั้นตอนต่อมาก็จะทำการโหลด Kernel image (bzImage, zImage) ที่ถูกบีบอัดและเก็บอยู่ในอุปกรณ์จัดเก็บข้อมูล (เช่น MMC/SD card, NAND Flash, USB Storage หรือผ่านระบบเครือข่ายด้วยโปรโตคอล tftp NFS เป็นต้น) หลังจากนั้นก็จะทำการแตกโปรแกรมไบนารีที่ถูกบรรจุอยู่ภายใน Kernel image ที่ถูกบีบอัดนั้นอยู่ เพื่อนำไปโหลดขึ้นสู่หน่วยความจำภายใน (RAM) เพื่อติดต่อกับอุปกรณ์อื่นๆ เช่น พอร์ต Ethernet หรือ พอร์ต USB เป็นต้น ในระหว่างการทำงานของ Bootloader นั้นสามารถที่จะเข้าสู่หน้าต่างคอนโซล (console) เพื่อเรียกใช้ชุดคำสั่งที่เตรียมไว้ให้ เช่นการดาวน์โหลดข้อมูลผ่านระบบเครือข่ายหรือจากอุปกรณ์จัดเก็บข้อมูลทางด้านตรวจสอบสถานะของหน่วยความจำ ตรวจสอบสถานะการทำงานของฮาร์ดแวร์ภายใน เป็นต้น &#x20;

เพื่อให้นักพัฒนาได้เห็นภาพมากขึ้นจึงขอสรุปขั้นตอนการทำงานของ bootloader ตั้งแต่เริ่มบูทเข้าระบบของบอร์ดสมองกลฝังตัวได้ดังนี้ (ดังแสดงในรูปที่ 3.12 และ 3.13)

1. หน่วยประมวลผลกลางจะเริ่มอ่านที่ตำแหน่งของหน่วยความจำ ROM ที่ได้ถูกกำหนดไว้ และดำเนินการทำตามชุดคำสั่งภายในโค้ดที่ถูกเก็บอยู่ภายใน&#x20;
2. เริ่มต้นเตรียมระบบฮาร์ดแวร์พื้นฐานสำคัญ เช่น หน่วยประมวลผลกลาง ส่วนควบคุมหน่วยความจำ (SDRAM Controller) ส่วนควบคุมตัวบันทึกข้อมูล (MMC Controller) ส่วนควบคุมอินพุท/เอาท์พุท (I/O Controllers) และ ส่วนควบคุมการแสดงผล (Graphics Controllers) เป็นต้น
3. เริ่มต้นเตรียมระบบหน่วยความจำ SDRAM โดยการจัดสรรพื้นที่ภายในหน่วยความจำให้กับฟังก์ชันที่จะใช้ควบคุมฮาร์ดแวร์ของแต่ละส่วน และจัดสรรพื้นที่ให้กับตัวเคอร์เนลที่ถูกเก็บอยู่ภายในอุปกรณ์บันทึกข้อมูล
4. เมื่อเคอร์เนลได้ถูกโหลดขึ้นหน่วยความจำ SDRAM แล้ว จะทำการติดต่อและตรวจสอบสถานะการทำงานของฮาร์ดแวร์ส่วนที่เหลือทั้งหมดเพื่อเตรียมทำการโหลดระบบปฏิบัติการในส่วนที่เหลือที่เรียกว่า root file system ซึ่งบรรจุสคริปท์ ไลบรารี และโปรแกรมต่างๆเอาไว้&#x20;
5. เมื่อ root file system ถูกโหลดได้สำเร็จ ระบบปฏิบัติการก็จะเรียกโปรแกรมระบบพื้นฐานทั้งหมดที่เกี่ยวกับการจัดการระบบไฟล์ (file system) โปรแกรมจัดการโปรเซส (process) โปรแกรมจัดการลำดับการทำงานของโปรเซส (process scheduling) และเตรียมระบบสำหรับผู้ใช้เพื่อสามารถใช้โปรแกรมประยุกต์ภายในระบบปฏิบัติการสมองกลฝังตัว

<figure><img src="https://1856353139-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MClo3nC-1US0rbK8Qau%2Fuploads%2FYI6i7D5C24P3eU8yXbGC%2Fboot%20process.png?alt=media&amp;token=5643cb3f-cd9e-4628-920a-cdf3d29cefae" alt=""><figcaption><p>ขั้นตอนการบูทระบบ</p></figcaption></figure>

ขั้นตอนการทำงานเริ่มต้นของลีนุกซ์คอร์เนล (Kernel Initialisation)

<figure><img src="https://1856353139-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MClo3nC-1US0rbK8Qau%2Fuploads%2FgW0yahmV3eA7poWITCVD%2FKernel%20Initialization.png?alt=media&amp;token=6a360b29-21fc-41cb-8468-c2da72c99a75" alt=""><figcaption><p>ขั้นตอนการเริ่มต้นของ Linux Kernel</p></figcaption></figure>

ตัวอย่างขั้นตอนการทำงานจริงของ bootloader บนบอร์ดสมองกลฝังตัวที่ใช้ OMAP3 SoC ของบริษัท TI ดังแสดงในรูปข้างล่าง

<figure><img src="https://1856353139-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MClo3nC-1US0rbK8Qau%2Fuploads%2Fb4aUR8oTJNado9kJNfnu%2FOMAP%20bootloader.png?alt=media&amp;token=e33c5746-7da7-40ff-b942-7f584ef41840" alt=""><figcaption><p>แสดงขั้นตอนการทำงานของ bootloader บน OMAP3 SoC</p></figcaption></figure>
