Monthly Archives: November 2016

ขั้นตอนการทำงานของโปรแกรมยูบูต (u-boot execution flow)

หลังจากที่ได้ทำความเข้าใจกับขั้นตอนการสร้างยูบูต (compile-time) แล้ว เราลองมาทำความเข้าใจกับขั้นตอนการทำงานของโปรแกรมยูบูต (run-time) กันต่อเลยดีกว่า โดยทั่วไปสามารถแบ่งขั้นตอนการทำงานของโปรแกรมยูบูต ได้เป็นสองรูปแบบ คือ แบบมีการย้ายตำแหน่งของยูบูต (Relocation) กับแบบไม่มีการย้ายตำแหน่งของยูบูต (Non relocation) ซึ่งมีขั้นตอนโดยรวมแทบจะเหมือนกันเว้นแต่ส่วนการย้ายยูบูตไบนารี่โค้ด แม้ว่าในโค้ดเวอร์ชั่นปัจจุบัน (2016.xx) จะใช้การย้ายตำแหน่งของยูบูต (Relocation) เป็นส่วนใหญ่ แต่เรายังสามารถพบลักษณะการบูตโดยไม่มีการย้ายตำแหน่งของยูบูต ในระบบขนาดเล็ก เนื่องการทำงานของโค้ดส่วนนี้ มีความน่าสนใจศึกษาอยู่ ในบทความนี้จึงขอแบ่งรูปแบบของการทำงานโดยใช้เรื่องนี้เป็นหลักนะครับ ก่อนจะทำความเข้าใจการทำงานทั้งหมด ขออธิบายเรื่องการย้ายตำแหน่งยูบูตให้เข้าใจกันก่อน

การใช้งานยูบูตบนแพลตฟอร์มที่มี ROM ขนาดเล็กด้วย ยูบูตฉบับย่อส่วน (u-boot SPL/TPL)

ในการออกแบบระบบฝังตัวบางครั้ง เราอาจมีข้อจำกัดเรื่องราคาของตัวผลิตภัณฑ์ ทำให้นักออกแบบต้องไปเลือกใช้แฟลซเมมโมรี่แบบอนุกรมที่มีราคาถูกกว่า แต่ปัญหาของอุปกรณ์หน่วยความจำแบบนี้ก็คือ ซีพียูส่วนใหญ่ไม่สามารถทำงานกับอุปกรณ์แบบอนุกรมโดยเข้าถึงผ่านเมมโมรี่สเปซได้ ซึ่งนั่นทำการบูตจากอุปกรณ์หน่วยความจำแบบอนุกรมเป็นไปไม่ได้เลย ยกตัวอย่างเช่น หากเราใช้ SPI flash เพื่อเก็บตัวยูบูตหรือลินุกซ์เคอร์เนลไว้ ซีพียูจะไม่สามารถอ่านข้อมูลออกมาได้หาก SPI คอนโทรลเลอร์ ไม่ได้ถูกตั้งค่าเริ่มต้น และแม้ว่าระบบบัสจะทำงานได้ แต่เราก็ไม่สามารถ เข้าถึงข้อมูลใน SPI flash โดยการอ้างตำแหน่งแบบตรงๆ

ทำความเข้าใจ ขั้นตอนการคอมไพล์ u-boot ตอนที่ 2

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

ความแตกต่างและหน้าที่ของไดเรคทอรี่ /proc และ /sys

แอดมินเคยได้รับคำถามเกี่ยวกับความแตกต่างและหน้าที่ของไดเรคทอรี่ /proc และ /sys ในตอนที่ไปสอนเรื่องลินุกซ์กับน้องๆ แล้วรู้สึกว่ายังอธิบายไม่ค่อยดีเท่าไหร่เนื่องจากตัวเองก็ยังมีคำถามในใจหลายข้อ เพราะบางอย่างที่มีอยู่ใน /sys ก็มีอยู่ใน /proc โดยที่มีโครงสร้างใกล้เคียงกัน ทำให้ไม่เข้าใจว่าจะมีซ้ำซ้อนไปทำไม แม้ว่าตัวเองจะเคยเขียนไดร์เวอร์ที่ใช้ sysfs ติดต่อกับโมดูล แต่ก็ยังไม่เข้าใจทั้งหมด จนกระทั่งได้ไปเจอคำตอบนี้จาก stackexchange นี้เข้าซึ่งคิดว่าอธิบายน่าจะครบถ้วนเลยรวมมาให้คนที่สนใจเหมือนกัน

ทำความเข้าใจ ขั้นตอนการคอมไพล์ u-boot ตอนที่ 1

หลายๆคนที่เคยเริ่มคอมไพล์ยูบูตด้วยตัวเอง คงมีคำถามเกี่ยวกับขั้นตอนต่างๆ ที่เกิดขึ้นหลังจากการเริ่มการคอมไพล์โปรเจค เนื่องจากมันจะมีข้อความมากมายส่งออกมาที่หน้าจอจนอาจทำความเข้าใจได้ไม่ทั้งหมด แต่ถ้าเราลองมาพิจารณาทีละส่วน การจะเข้าใจขั้นตอนการคอมไพล์ยูบูต ก็เริ่มเป็นไปได้มากขึ้น จริงๆแล้วการทำความเข้าใจในขั้นตอนเหล่านี้จะเป็นพื้นฐานที่ดีในการทำความเข้าใจการคอมไพล์ระบบฝังตัวของโปรเจคอื่นๆด้วย เนื่องจากมีหลักการไม่ต่างกันมาก

เริ่มต้นทำความรู้จัก ยูนิเวอร์แซล บูตโหลดเดอร์กันดีกว่า

What is the Boot Loader? การนิยาม บูตโหลดเดอร์ให้ครอบคลุมสำหรับทุกแพลตฟอร์มอาจทำให้สับสนได้เนื่องความแตกต่างกันและข้อจำกัดต่างๆ ของฮาร์ดแวร์ ตัวอย่างเช่นบูตโหลดเดอร์ของราสเบอรี่พายซึ่งทำหน้าที่ตั้งแต่การตั้งค่าระบบต่างๆทุกอย่างไปจนถึงการโหลดลินุกซ์เคอร์เนล เปรียบเทียบกับบูตโหลดเดอร์ของ PC ซึ่งทำหน้าที่เพียงการโหลดลินุกซ์เคอร์เนลเท่านั้น เนื่องจากหน้าที่การกำหนดค่าเริ่มต้นระบบเป็นของ BIOS จึงอาจกล่าวได้ว่า BIOS ทำหน้าที่เป็นบูตโหลดเดอร์ช่วงที่หนึ่ง