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

By | November 22, 2016

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

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

*** ขยายความเรื่องการเข้าถึงผ่านเมมโมรี่สเปซ คือโดยปกติอุปกรณ์หน่วยความจำที่อยู่บนเมมโมรี่สเปซ ซีพียูจะสามารถเข้าถึงทั้งการอ่านและเขียนโดยการอ้างถึงตำแหน่งของอุปกรณ์นั้น(เช่นคำสั่ง mov, ld ) ยิ่งถ้าเป็นการเข้าถึงเพื่อที่จะทำ instrcution cycle (fetch-decode-execute) ก็ต้องเป็นการเข้าถึงผ่านเมมโมรี่สเปซเท่านั้น ซึ่งหากเป็นอุปกรณ์หน่วยความจำประเภทอนุกรม(I2C/SPI) ซีพียูจำเป็นต้องใช้ไดร์เวอร์ในการอ่านข้อมูล(โค้ด)มาพักที่หน่วยความจำหลักก่อนแล้วจึงจะ fetch โค้ดส่วนนั้นได้

ขั้นตอนการบูตของระบบที่มีข้อจำกัดแบบนี้(จำกัดโดย ขนาด internal flash) จึงจำเป็นต้องมีโปรแกรมบูตโหลดเดอร์ช่วงแรกซึ่งมีขนาดเล็ก เพื่อใช้กำหนดค่าเริ่มต้นส่วนที่จำเป็นให้ทำงานได้ก่อน เช่นหน่วยความจำหลัก,ส่วนอินเตอร์เฟสกับหน่วยความจำแบบอนุกรม จากนั้นจึงทำการโหลดบูตโหลดเดอร์ตัวเต็ม ไปยังหน่วยความจำหลักแล้วจึงโอนการควบคุมทั้งหมดไปยังบูตโหลดเดอร์ในช่วงถัดไป

เพื่อให้โปรแกรมยูบูตสามารถทำงานได้บนแพลตฟอร์มที่มีข้อจำกัดเหล่านี้ u-boot SPL จึงเกิดขึ้นเพราะเนื่องจากว่าส่วนประกอบหลักที่ใช้ในการตั้งค่าเริ่มต้นต่างๆ นั้นมีอยู่ครบแล้วในโปรเจคยูบูต ทำให้ u-boot SPL เหมือนเป็นอีกคอนฟิกนึงซ้อนทับอยู่บนโปรเจคยูบูต โดยใช้ความสามารถของ พรีโปรเซสเซอร์ในการเลือกรวมเฉพาะส่วนที่จำเป็น เพื่อให้ตัวไบนารี่เอาพุตมีขนาดเล็กพอ

RBL (ROM Boot Loader) ในการออกแบบซีพียูรุ่นใหม่ๆ ในปัจจุบัน ผู้ผลิตมักจะใส่บูตโหลดเดอร์ของตัวเองไว้ใน ROM ของตัวซีพียู สำหรับกำหนด/เลือก โหมดในการบูต ข้อมูลใน ROM ส่วนนี้มักแก้ไขไม่ได้โดยนักพัฒนาเฟิรมแวร์ และโปรแกรมส่วนนี้เองที่ทำหน้าที่โหลดตัว u-boot SPL (หรือ u-boot ตัวเต็ม หากสามารถทำได้)

SPL (Secondary Program Loader) แปลตรงตัวก็คือ โปรแกรมโหลดข้อมูลลำดับที่สอง ในระบบที่ RBL นั้นไม่สามารถโหลดบูตโหลดเดอร์หรือเคอร์เนลขึ้นมาทำงานได้ SPL จะรับหน้าที่ตั้งค่าเริ่มต้นในส่วนที่จำเป็นก่อนแล้วจึงโหลดบูตโหลดเดอร์ตัวเต็มมาทำงานต่อไป

TPL (Tertiary Program Loader) โปรแกรมโหลดข้อมูลลำดับที่สาม ในระบบที่ทรัพยากรจำกัดมากๆ จน SPL ก็ยังไม่สามารถโหลดบูตโหลดเดอร์ตัวเต็มมาทำงานได้ เช่น powerpc (mpc85xx) จำเป็นต้องมีโปรแกรมโหลดเดอร์อีกขั้นหนึ่งมาทำงาน หรืออาจเรียกว่า SPL ที่ใช้โหลด SPL

เท่าที่ศึกษามาจนถึงตอนนี้แอดมินยังไม่เห็นโปรแกรมที่ใช้โหลดโปรแกรมแยกย่อยมากไปกว่านี้ แต่ในอนาคตอาจจะมีก็ได้

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

bootstage_define_w

ตอนนี้แอดมินยังไม่มีตัวอย่างสำหรับการทดลองเรื่อง u-boot (SPL/TPL) ในภาคปฏิบัติ จึงขอติดไว้ก่อนละกัน

ตัวอย่างของการแบ่งบูตออกเป็นสเตจต่างๆ ของ AM335x

http://processors.wiki.ti.com/index.php/The_Boot_Process

Leave a Reply

Your email address will not be published. Required fields are marked *