曾海峰
(廣東科貿職業學院 廣東 510430)
在社會日益信息化的今天,嵌入式系統已涉及工業、軍事、通信、運輸、金融、醫療等眾多領域。在實際的工程應用中,這些系統更新通常采用JTAG接口、RS232串口、USB接口或SD卡等聯機方式進行,但在投入運行后,系統會因為前期研發未能檢測到的 Bug,或者用戶對系統提出新的功能和性能需求而需要更新固件,此時如果嵌入式設備安裝數量較多且安裝位置分散而不易拆裝,采用人工方式更新系統將會花費較大的人力、物力和財力。因此,系統的遠程更新就顯得尤為重要,它的實現將大大節省產品維護成本,增強產品競爭力。
本系統基于以太網技術,采用C/S通信架構實現嵌入式系統固件的遠程更新。服務端使用Linux操作系統,服務程序采用 C/C++編程技術進行設計,數據庫選用開源免費的 MySQL作為信息存儲倉庫,系統實現的主要功能在于收集在線客戶機信息、身份合法性認證以及系統固件傳輸。其中,客戶機信息包括客戶機網卡的MAC地址、客戶機系統版本、登錄狀態以及更新狀態。客戶端系統則采用ARM+Linux,軟件系統由Bootloader、Kernel、File System 以及應用程序組成。其中,Bootloader程序是實現遠程系統更新的核心部分;Kernel和File System部分是固件更新的主要內容,當更新完成后將利用系統的守護進程來完成與服務端的版本同步。
客戶機選用三星的S5PV210芯片作為微處理核心,該芯片采用了ARM CortexTM-A8內核,ARM V7指令集,主頻可達1GHZ,可以實現2000DMIPS的高性能運算能力,并且提供存儲控制器支持和豐富的外圍接口。
系統內存采用4片128M大小的DDR2類型芯片,共計512M內存空間,可操作地址為:0x20000000~0x3fffffff,14根地址總線。系統存儲采用SLC類型的NAND FLASH芯片,存儲容量為1G,主要用于存放Bootloader、Linux內核、文件系統以及應用程序。以太網適配器采用DM9000AEP芯片,工作在16bit 數據模式下,連接了nGCS1片選線,使得dm9000訪問空間映射至SROMC_BANK1區域,其資源訪問起始地址為0x88001000。

圖1 Bootloader啟動流程
Bootloader是嵌入式系統啟動的第一階段,主要完成硬件初始化和系統內核引導工作。由S5PV210芯片的啟動過程可知,Bootloader包含BL0和BL1二個部分,其中BL0是由三星公司以固件形式提供,完成啟動設備的硬件初始化;BL1是由用戶自定義,完成系統引導等工作。
本方案結合Bootloader技術,在BL0的基礎上完成外圍基礎設備的硬件初始化,利用網絡進而實現遠程的系統更新功能。BL1的設計流程如圖1所示,詳細設計步驟如下:
(1)首先,BL1對CPU運行模式和時鐘進行設置,初始化內存管理器、NAND FLASH芯片以及DM9000網絡芯片,以保證硬件系統的正常運行;
(2)從NAND FLASH指定位置中讀取系統更新的標記位,如果標記位為0x0,表示系統固件需要更新,如果值為0xf則表示系統不需要升級,而后直接啟動內核;
(3)如果系統固件需要更新,BL1將利用哈希算法對本機網卡的48bit MAC地址進行加密,形成的128bit密文與請求下載的文件名稱整合后再發送至服務器并等待其響應,如果在5秒內無響應,則在FLASH中設置錯誤標記,隨后直接啟動原有內核;
(4)如果服務器返回最新的系統固件,BL1會利用TFTP傳輸協議將其保存至內存的0x21000000地址處,并進行文件檢驗,從而保證系統固件的完整性。如果校驗成功,則調用NAND芯片操作程序將內存中的系統固件燒寫至FLASH的指定位置;如果校驗失敗,程序將重新向服務器發送下載請求,重新接收文件,如果超出三次檢驗失敗,則在FLASH中設置錯誤標記后啟動原有內核。

圖2 Linux系統應用設計
基于Linux系統的應用層設計,本方案主要實現了系統更新成功后的確認操作以及定期版本查詢的功能。應用設計流程如圖2所示,具體設計思路如下:
(1)首先,由Linux系統的INIT進程產生一個守護進程,隨后的功能實現均通過這個進程來設計;
(2)從NAND FLASH指定位置中讀取系統更新標記位和錯誤標記位,如果更新標記位為0x0且沒有錯誤標記,表示系統已經完成更新,此時將清空更新標記位并設置為0xf,并將當前版本信息寫入 FLASH中相應位置;如果更新標記位為 0x0且發現錯誤標記,則表示系統在更新過程出現了錯誤,立即向服務器發送錯誤報告;
(3)為了保證系統更新的同步性和實效性,系統專門設計了版本在線查詢功能,通過定期向服務器發送查詢請求來獲知系統固件最新的版本信息,從而判斷是否需要更新。如果發現新版本,程序將會在FLASH中設置更新標記位為0x0,保存當前的工作狀態后重啟Linux系統,最終利用Bootloader完成系統更新。

圖3 服務端程序設計
如圖3所示,服務端程序的主要功能是監聽和處理遠程客戶機請求。如果其接收到查詢請求,則會將客戶機信息和查詢時間登記至系統數據庫,然后返回系統固件的最新版本信息;如果接收到下載請求,則首先對客戶機提交的密文進行合法性檢測,認定合法后向客戶機發送系統更新文件,同時登記客戶機的版本信息。
本文結合實際應用,經橫向對比現有嵌入式系統的更新方式和安全性能后提出了基于以太網實現的嵌入式系統遠程更新設計方案。本方案利用Bootloader技術和網絡技術設計了一套基于C/S架構的遠程系統更新體系,對無操作系統環境下的嵌入式應用實現了遠程的固件更新;同時,當系統更新失敗或固件丟失之時也能夠自動進行系統復原,從而有效提高固件的傳輸速率,保障更新的可靠性和安全性。經過一段時間實際項目的應用測試,系統運行安全可靠且具實效性,有效提高了嵌入式系統遠程固件更新的便捷性。
[1]王恒,王颋,王泉,李勇.基于Bootloader的可靠嵌入式軟件遠程更新機制[J].微計算機信息.2007.
[2]王恒,王颋,李敏,羅洪平.一種高可靠的嵌入式軟件遠程自更新機制的研究與實現[J].工業控制計算機.2007.
[3]邵奇峰,楊天池,郭松輝.一種輕量級嵌入式設備遠程安全更新協議[J].計算機應用與軟件.2014.