Hiểu riêng bootloader là chưa đủ, vì muốn thiết kế hoặc debug đúng thì cần nhìn toàn bộ vòng đời khởi động của hệ thống. Nhiều lỗi trông giống lỗi bootloader nhưng thực tế lại nằm ở stage trước hoặc stage sau trong boot chain.
Bài này tóm tắt boot flow từ lúc hệ thống reset cho tới khi application hoặc userspace bắt đầu chạy. Phạm vi chính là embedded system, với hai nhánh quen thuộc là microcontroller và embedded Linux.
Mục lục
Giai đoạn ngay sau reset
Sau khi được cấp nguồn hoặc reset, CPU quay về một trạng thái xác định trước bởi phần cứng. Ở thời điểm này, application chưa thể chạy ngay vì hệ thống cần một điểm bắt đầu rõ ràng, cần biết sẽ đọc mã lệnh từ đâu, và trong nhiều trường hợp còn phải chờ một số điều kiện phần cứng ổn định.
Các loại reset khác nhau có thể dẫn tới cùng một boot flow hoặc các nhánh xử lý khác nhau, tùy thiết kế hệ thống. Trong thực tế thường gặp power-on reset, watchdog reset và software reset.
Power-on reset là reset xảy ra khi hệ thống vừa được cấp nguồn.
Watchdog reset là reset do watchdog kích hoạt khi phần mềm treo hoặc không phản hồi đúng thời gian.
Software reset là reset do phần mềm chủ động yêu cầu.
Boot chain
Boot chain là chuỗi các stage khởi động nối tiếp nhau, bắt đầu từ phần cứng ban đầu và kết thúc ở application hoặc hệ điều hành chính. Mỗi stage làm một phần việc nhất định rồi chuyển quyền điều khiển cho stage tiếp theo.
Việc chia thành nhiều stage giúp tách trách nhiệm. Stage đầu thường nhỏ, phụ thuộc sát phần cứng và làm ít việc, còn stage sau có nhiều tài nguyên hơn nên có thể xử lý logic phức tạp hơn như chọn image, xác thực image, recovery hoặc load kernel.
Boot chain là chuỗi các bước khởi động từ phần cứng ban đầu tới phần mềm chính.
Stage là một tầng trong boot chain, ví dụ ROM code, bootloader, kernel.
Boot ROM
Trong nhiều chip, stage đầu tiên là Boot ROM do nhà sản xuất chip cung cấp. Phần này được ghi sẵn trong ROM và không thay đổi được trong vận hành bình thường.
Boot ROM thường xử lý các việc nền tảng như:
- xác định boot mode
- chọn boot source
- đọc image đầu tiên từ flash, eMMC, SD hoặc network tùy chip
- kiểm tra tính hợp lệ sơ bộ của image
- chuyển quyền điều khiển cho stage tiếp theo
Boot mode là chế độ khởi động mà hệ thống chọn, ví dụ boot bình thường, update mode hoặc update mode.
Boot source là nơi hệ thống lấy phần mềm đầu tiên để khởi động, ví dụ internal flash, eMMC, SD card, USB hoặc network.
Boot ROM thường ít linh hoạt và thường chỉ đủ để đưa hệ thống sang stage tiếp theo. Các logic cụ thể của sản phẩm thường nằm ở bootloader do đội phát triển tự kiểm soát.
First-stage và second-stage bootloader
Nhiều hệ thống không chỉ có một bootloader. Với các nền tảng phức tạp hơn, boot chain thường tách thành nhiều lớp. Một mô hình phổ biến là first-stage bootloader xử lý phần khởi tạo rất sớm, sau đó chuyển sang second-stage bootloader để làm các việc nặng hơn.
First-stage bootloader thường nhỏ, gần phần cứng hơn và bị giới hạn bởi bộ nhớ hoặc môi trường chạy. Second-stage bootloader thường có nhiều tài nguyên hơn nên có thể xử lý chọn image, load kernel, recovery, network boot hoặc secure boot.
Trên microcontroller nhỏ, hệ thống có thể chỉ có một bootloader hoặc không có bootloader riêng. Ngược lại, trên SoC chạy Linux thì mô hình nhiều stage là chuyện bình thường, ví dụ Boot ROM → SPL → U-Boot → Linux kernel.
Boot flow trên microcontroller
Với microcontroller, boot flow thường ngắn hơn. Một flow điển hình có thể là:
- reset xảy ra
- CPU đọc reset vector
- startup code thiết lập môi trường chạy tối thiểu
- bootloader kiểm tra image nếu có
- jump sang application
Nếu hệ thống đơn giản, application có thể chạy gần như trực tiếp sau reset mà không có bootloader riêng theo nghĩa đầy đủ. Khi cần firmware update, recovery hoặc rollback an toàn, bootloader thường sẽ xuất hiện như một thành phần tách biệt.
Reset vector là địa chỉ khởi đầu mà CPU dùng để biết mã lệnh đầu tiên cần chạy sau reset.
Startup code là phần mã khởi tạo rất sớm của application, thường thiết lập stack, copy vùng data và zero BSS trước khi gọi
main().
Boot flow trên embedded Linux
Trên embedded Linux, số stage thường nhiều hơn đáng kể. Một chuỗi điển hình có thể gồm:
- Boot ROM
- first-stage bootloader
- second-stage bootloader, ví dụ U-Boot
- Linux kernel
- device tree
- initramfs nếu có
- root filesystem
- userspace
Ở đây bootloader không chỉ kiểm tra image rồi nhảy vào application. Nó còn phải nạp kernel, truyền boot arguments, nạp device tree, chọn root filesystem và trong nhiều trường hợp còn tham gia vào recovery hoặc update logic.
Device tree là dữ liệu mô tả phần cứng để kernel biết hệ thống có những thành phần gì và cách truy cập chúng.
Initramfs là filesystem tạm được nạp sớm cùng kernel để chuẩn bị bước mount root filesystem chính.
Userspace là phần môi trường chạy của hệ điều hành sau khi kernel đã khởi động xong.
Các quyết định quan trọng trong boot flow
Dù là MCU hay embedded Linux, boot flow luôn phải chốt một số điểm cơ bản:
- boot từ nguồn nào
- boot theo mode nào
- chạy image chính hay image recovery
- dùng single image hay A/B image
- có kiểm tra chữ ký số hay không
- nếu image lỗi thì rollback theo cách nào
Những quyết định này ảnh hưởng trực tiếp tới thiết kế update, recovery và mức độ fail-safe của toàn hệ thống.
Các lỗi thường gặp
Khi boot flow có nhiều stage, lỗi có thể nằm ở nhiều chỗ khác nhau. Một số lỗi thường gặp là:
- chọn sai boot source
- image bị hỏng hoặc không khớp định dạng
- sai memory layout
- jump sai địa chỉ
- kernel load được nhưng root filesystem lỗi
- boot loop sau update
Vì vậy, khi debug boot cần nhìn boot chain như một chuỗi liên tục, không nên xem từng stage như các khối hoàn toàn tách rời.
Liên hệ với update và recovery
Trong hệ thống thật, boot flow gần như luôn gắn với firmware update và recovery. Một thiết kế boot chain yếu thường kéo theo rủi ro update lỗi, không rollback được hoặc dễ brick thiết bị, trong khi một boot chain tốt sẽ tạo nền cho A/B partition, image phục hồi, verified boot và secure boot.
Thiết kế update an toàn luôn bắt đầu từ thiết kế boot flow đúng.
Kết luận
Bootloader chỉ là một phần trong toàn bộ vòng đời khởi động của hệ thống. Muốn thiết kế tốt hoặc debug đúng, cần nhìn cả boot chain từ reset, Boot ROM, các stage bootloader cho tới application hoặc userspace. Khi có được bản đồ này, việc phân tích flash layout, fail-safe update hay secure boot sẽ rõ ràng hơn.








