Flash layout là một trong những quyết định quan trọng nhất khi thiết kế bootloader. Cùng một chức năng update firmware, chỉ cần tổ chức flash khác nhau thì độ an toàn, độ phức tạp và khả năng recovery của hệ thống cũng khác hẳn.
Với microcontroller, bài toán này không chỉ là chia vùng nhớ cho đủ dùng. Flash layout còn quyết định bootloader nằm ở đâu, application nằm ở đâu, metadata lưu thế nào, update theo kiểu nào và khi có lỗi thì hệ thống còn đường quay lại hay không.
Mục lục
Khái niệm flash layout
Flash layout là cách tổ chức không gian flash memory thành các vùng có vai trò khác nhau. Các vùng này thường bao gồm bootloader, application, metadata, cấu hình hệ thống và đôi khi có thêm vùng tạm cho update hoặc recovery.
Metadata là dữ liệu mô tả image, ví dụ version, size, CRC, trạng thái xác nhận hoặc trạng thái rollback.
Image phục hồi là application image dự phòng dùng để cứu hệ thống khi application image không boot được.
Các vùng thường có trong flash memory layout
Một flash layout điển hình trên MCU thường có một số vùng sau:
- Bootloader region: Chứa bootloader hoặc boot manager.
- Application region: Chứa application image chính của sản phẩm.
- Metadata region: Chứa thông tin để bootloader quyết định image có hợp lệ không.
- Config region: Chứa cấu hình, calibration hoặc dữ liệu cần giữ qua nhiều lần update.
- Temporary or staging region: Vùng tạm để nhận application image mới trong quá trình update.
Không phải hệ nào cũng có đủ tất cả các vùng này. Một thiết kế nhỏ có thể chỉ có bootloader và application. Một thiết kế an toàn hơn thường có thêm metadata, image phục hồi hoặc hai slot image song song, tùy mức độ fail-safe cần đạt.
Ảnh hưởng của flash layout tới độ an toàn
Flash layout quyết định cách update firmware diễn ra. Ghi đè trực tiếp lên image đang chạy làm tăng nguy cơ hệ thống không còn image hợp lệ để boot nếu mất điện giữa chừng. Nếu có vùng tạm hoặc slot dự phòng, hệ thống sẽ có thêm cơ hội kiểm tra image trước khi chuyển sang boot từ application image mới.
Flash layout là nền của fail-safe update. Nếu layout không đúng, rollback, update mode hay A/B boot đều rất dễ hỏng từ gốc.
Các layout phổ biến
Single image layout
Đây là cách đơn giản nhất. Flash có một vùng bootloader và một vùng application image chính. Khi update, application image mới thường được ghi trực tiếp vào vùng application.
Ưu điểm
- Đơn giản, ít tốn flash.
- Dễ triển khai trên MCU nhỏ.
Nhược điểm
- Rủi ro cao nếu update bị gián đoạn.
- Khả năng rollback thường kém hoặc gần như không có.
Single image layout phù hợp khi tài nguyên flash hạn chế và chi phí lỗi update có thể chấp nhận được. Với các sản phẩm cần độ tin cậy cao, cách này thường không đủ.
Single image với staging area
Một biến thể an toàn hơn là thêm vùng staging để nhận application image mới trước. Bootloader có thể kiểm tra image trong vùng staging, sau đó mới chép sang vùng application image chính theo một quy trình được kiểm soát.
Ưu điểm
- An toàn hơn kiểu ghi đè trực tiếp.
- Vẫn tiết kiệm flash hơn A/B full slot.
Nhược điểm
- Chậm hơn vì thường phải ghi vào staging rồi copy sang vùng application.
- Tăng số lần erase và program flash.
- Logic update phức tạp hơn.
- Nếu copy bị gián đoạn vẫn cần cơ chế recovery rõ ràng.
A/B layout
Với A/B layout, flash có hai slot image song song, ví dụ slot A và slot B. Ở đây, slot nên được hiểu là một vùng flash dành cho một image hoàn chỉnh, để bootloader có thể chọn boot vào vùng này hoặc vùng khác. Hệ thống đang chạy từ một slot, còn application image mới được nạp vào slot còn lại. Sau khi ghi xong và kiểm tra xong, bootloader mới chuyển sang boot từ slot mới.
A/B layout không phải lúc nào cũng khả thi trên MCU. Một giới hạn quan trọng là kiến trúc thực thi mã lệnh của vi điều khiển. Có những MCU chỉ hỗ trợ boot hoặc execute thuận tiện từ một vùng flash cố định, hoặc việc chạy application ở offset khác đòi hỏi cơ chế remap, relocation hay cấu hình vector table rất chặt. Nếu MCU không hỗ trợ tốt cho việc execute image ở nhiều offset khác nhau, A/B layout sẽ khó triển khai hoặc phải trả giá bằng độ phức tạp cao hơn.
Ưu điểm
- Dễ làm rollback hơn.
- Hợp với hệ cần update an toàn.
- Có thể giữ lại application image cũ cho tới khi application image mới được xác nhận.
Nhược điểm
- Đòi hỏi nhiều flash hơn.
- Cần metadata rõ ràng để biết slot nào active, slot nào pending, slot nào confirmed.
- Thường làm thiết kế bootloader và update logic phức tạp hơn.
Update mode layout
Một số hệ không dùng A/B đầy đủ mà giữ riêng một update mode tối thiểu. Chế độ này có thể là update mode bên trong bootloader, một flash loader riêng hoặc trong một số thiết kế cụ thể là một image phục hồi nhỏ. Mục tiêu chung vẫn là giữ lại một đường để nhận firmware mới, kiểm tra firmware hoặc đưa hệ thống về trạng thái có thể boot lại.
Cách này thường xuất hiện khi flash không đủ để giữ hai image đầy đủ, nhưng sản phẩm vẫn cần một đường cứu hộ nếu application image chính bị hỏng. Với MCU, cách gặp nhiều hơn là update mode hoặc flash loader, còn image phục hồi riêng thường ít phổ biến hơn so với rich OS.
Những thông tin nên có trong metadata
Metadata là phần nhỏ nhưng rất quan trọng. Nếu không có metadata rõ ràng, bootloader sẽ khó ra quyết định đúng trong quá trình boot và update. Vùng metadata có thể nằm trong code flash, data flash, EEPROM hoặc một vùng NVM riêng, tùy kiến trúc MCU và yêu cầu update.
- Magic number.
- Version.
- Image size.
- CRC hoặc checksum.
- Địa chỉ bắt đầu hoặc offset của image.
- Trạng thái pending, confirmed hoặc invalid.
- Rollback counter nếu có.
Metadata nên đủ đơn giản để đọc nhanh và đủ rõ để hỗ trợ quyết định boot. Điều quan trọng không chỉ là metadata nằm ở đâu, mà còn là vùng đó phải đủ bền, đủ an toàn khi mất điện và không bị ghi đè nhầm trong quá trình update. Càng mập mờ ở chỗ này, logic boot càng dễ lỗi.
Những vùng không nên đặt chung
Một lỗi thiết kế hay gặp là để dữ liệu cấu hình hoặc calibration nằm chung vùng dễ bị ghi đè trong quá trình update. Khi đó firmware có thể lên thành công nhưng thiết bị lại mất cấu hình quan trọng.
Những dữ liệu có vòng đời khác với application nên được tách riêng, ví dụ:
- Serial number.
- Device key.
- Calibration data.
- Factory config.
- Field config cần giữ sau update.
Các trade-off khi chọn flash layout
Không có một flash layout tốt nhất cho mọi sản phẩm. Thiết kế phù hợp phụ thuộc vào giới hạn flash, yêu cầu update, mức độ chấp nhận rủi ro và khả năng recovery mong muốn.
- Ít flash thì thường phải chọn layout đơn giản hơn.
- Cần fail-safe cao thì thường phải dành thêm slot hoặc recovery region.
- Cần rollback thì metadata phải rõ và boot logic phải chặt.
- Cần bảo mật cao thì layout phải tính cả secure boot, anti-rollback và vùng key material.
Thiết kế layout luôn là bài toán cân bằng giữa dung lượng, độ an toàn và độ phức tạp triển khai.
Các lỗi thiết kế thường gặp
Một số lỗi dưới đây xuất hiện rất thường xuyên khi thiết kế flash layout cho bootloader trên MCU.
- Không chừa đủ chỗ cho image tăng kích thước về sau.
- Không tách metadata khỏi vùng dễ bị ghi đè.
- Ghi đè thẳng lên image đang chạy mà không có đường recovery.
- Để config quan trọng chung với application.
- Không tính tới alignment, erase block size hoặc bank boundary của flash.
Nhiều lỗi boot hoặc update về sau thực ra bắt nguồn từ quyết định layout ngay từ đầu.
Kết luận
Flash layout không chỉ là sơ đồ chia bộ nhớ. Nó là nền cho cách hệ thống boot, cách firmware được update và cách thiết bị tự cứu khi có lỗi. Nếu bootloader là logic điều phối, thì flash layout là mặt bằng để logic đó có thể hoạt động an toàn.








