嵌入式與裸機

韌體更新路徑(firmware update path)與開機載入程式

已經在客戶家中的洗衣機、恆溫器或汽車,終究會需要軟體修正或新功能——但你無法把每台裝置召回工廠。所以嵌入式產品在設計時就帶有一種在裝置部署「之後」替換快閃裡程式的方法。那個機制就是韌體更新路徑,其核心是一支小而可信、叫做開機載入程式(bootloader)的程式。

基本結構如下。快閃被切成(至少)兩個區段:一個位於重置向量、每次上電都最先執行的小「開機載入程式」,以及一個放你真正產品程式碼的較大「應用程式」。裝置上電時,開機載入程式先執行並決定:有沒有有效的應用程式可跳過去,還是有人要求安裝新的?正常運作時它驗證應用程式(常以檢查儲存的檢查碼,或更好的是密碼學簽章),然後跳進去。在更新模式——透過開機時按住按鈕、特殊命令或記憶體裡的旗標進入——開機載入程式改為透過某個通道「接收」新的韌體映像(USB DFU、序列埠,或無線的空中下載 OTA 更新),把它寫進快閃的應用程式區段、驗證它,然後重新開機進入它。因為應用程式不易改寫它自己正在執行的那片快閃,由(獨立執行的)開機載入程式來執行實際的快閃抹除與燒寫。開機載入程式通常「不」在現場更新(它是你必須永遠信任的部分),所以保持它微小且穩如磐石。

它之所以重要,是因為幾乎每個現代連網裝置都仰賴現場更新,在產品的一生中修補安全漏洞與臭蟲——沒有更新路徑的裝置永遠凍結在它出貨時的那些臭蟲裡。誠實且攸關安全的提醒:被中斷的更新(寫到一半斷電)可能讓裝置「變磚」,留下半寫、無法開機的應用程式,所以穩健的設計採用要嘛是一個總能重新進入更新模式的故障安全開機載入程式,要嘛是 A/B 雙區快閃——新映像寫進備用區,驗證通過後才切換,並允許回退。你應該在執行映像「之前」驗證它——最好用密碼學簽章,因為未驗證的更新路徑是讓攻擊者安裝惡意韌體的大門。而更新必須在任一瞬間的重置下都能存活;在每一步都為「萬一電源就在這裡斷掉怎麼辦」設計,是核心的紀律。

安全現場更新的快閃布局: 0x08000000 開機載入程式(微小、可信、最先執行、極少更新) 0x08008000 應用程式 A (目前韌體) 0x08040000 應用程式 B (放新映像的備用區) 更新:接收新映像 -> 寫入 B 區 -> 驗證簽章 -> 成功則標記 B 為作用中並重開機進入它(A 為回退)。 若寫到一半斷電,A 仍完好且可開機。

A/B 雙區更新:把新映像寫進備用區、驗證、再切換——所以更新途中斷電永不會讓裝置變磚。

未驗證的更新路徑會讓攻擊者安裝惡意韌體——請驗證映像,最好用密碼學簽章。而一個天真的單區更新若在寫到一半被中斷可能讓裝置變磚;A/B 雙區或故障安全開機載入程式可防止此事。

又称
bootloaderfirmware updateover-the-air updateOTADFU開機載入程式韌體更新