潘文卿,李國朋,張魯兵
(濰柴動力股份有限公司,山東 濰坊 261061)
嵌入式程序主要包含兩部分,一部分是用來更新應(yīng)用程序的引導(dǎo)加載程序,即Bootloader程序,簡稱Boot程序;另一部分是用于實(shí)現(xiàn)控制邏輯的應(yīng)用程序,簡稱APP程序。隨著客戶需求的多樣性和智能化,應(yīng)用程序不斷地迭代升級的同時,Boot程序也需要升級,本文介紹單Boot模式下程序運(yùn)行和升級的方法,包括Boot程序的升級。
Bootloader就是在操作系統(tǒng)內(nèi)核運(yùn)行之前運(yùn)行的一段程序,初始化硬件設(shè)備,建立內(nèi)存空間的映射關(guān)系,從而將系統(tǒng)的軟硬件環(huán)境帶到一個合適狀態(tài),以便最終調(diào)用操作系統(tǒng)內(nèi)核,做好正確的環(huán)境[1]。Bootloader是依賴于硬件而實(shí)現(xiàn)的,特別是在嵌入式系統(tǒng)中,所以需要構(gòu)建一個具有適用性、安全可靠的架構(gòu)。
Bootloader是所有支持重編程的ECU必須具備的軟件功能,在ECU運(yùn)行中,執(zhí)行的是應(yīng)用程序和數(shù)據(jù)實(shí)現(xiàn)客戶要求的控制邏輯,比如發(fā)動機(jī)轉(zhuǎn)速控制。只有在ECU應(yīng)用程序和數(shù)據(jù)需要更新時才會運(yùn)行Bootloader軟件。BootLoader可以實(shí)現(xiàn)應(yīng)用程序和應(yīng)用數(shù)據(jù)同時更新或者單獨(dú)更新,應(yīng)用數(shù)據(jù)也可以全部更新或根據(jù)分區(qū)不同進(jìn)行部分?jǐn)?shù)據(jù)更新。傳統(tǒng)意義上BootLoader無法再更新,除非拆件,用調(diào)試器進(jìn)行全區(qū)刷寫,但是現(xiàn)在隨著主機(jī)廠的需求不斷提升,要求Bootloader也要具備迭代更新的功能。
Bootloader除了具備更新應(yīng)用程序的功能,還需要具備以下功能。
1)安全保護(hù)措施:刷寫之前進(jìn)行UDS服務(wù)中的0x27服務(wù),通過seed&key形式進(jìn)行安全校驗(yàn),用特定的算法基于seed計(jì)算key,進(jìn)行比對,比對通過才可以進(jìn)行后續(xù)的刷寫流程,否則停止刷寫,保證ECU免遭惡意編程動作影響。
2)編程安全條件校驗(yàn):在刷寫之前首先保證車速,轉(zhuǎn)速為0的停車情況下才可以進(jìn)行刷寫控制流程,以保證車輛安全。
3)完整性校驗(yàn)功能:程序在跳轉(zhuǎn)到應(yīng)用程序之前要校驗(yàn)一下當(dāng)前刷寫到Flash中的應(yīng)用程序是完整的,否則停止跳轉(zhuǎn),停留在Bootloader中。
4)一致性檢查:驗(yàn)證軟件兼容性,檢查程序一致性,包括應(yīng)用軟件與Bootloader軟件,應(yīng)用軟件與應(yīng)用數(shù)據(jù)校驗(yàn),如果不一致,程序會發(fā)生復(fù)位,在復(fù)位次數(shù)達(dá)到一定程度時會自鎖在Bootloader中。
ECU上電或復(fù)位后,首先執(zhí)行Bootloader程序,進(jìn)行軟硬件映射關(guān)系檢查,然后檢查外部刷寫請求標(biāo)志位。
1)如果有刷寫請求,外部刷寫請求標(biāo)志位,此時即便應(yīng)用程序完成完整性檢查和一致性檢查,結(jié)果是通過的,也不會跳轉(zhuǎn)出Bootloader,Bootloader會繼續(xù)執(zhí)行后面的刷寫流程。
2)如果外部刷寫請求標(biāo)志位無效,繼續(xù)檢查應(yīng)用軟件完整性標(biāo)志位。
3)如果應(yīng)用是完整有效的,程序會跳轉(zhuǎn)到應(yīng)用程序的開始位置,開始執(zhí)行應(yīng)用程序。
4)如果應(yīng)用軟件是不完整或者無效,ECU停留在Bootloader中運(yùn)行。
圖1描述了Boot程序運(yùn)行和App程序跳轉(zhuǎn),在Boot和App中分別刷寫的過程。刷寫流程遵循UDS統(tǒng)一診斷服務(wù)協(xié)議。

圖1 Boot運(yùn)行和刷寫流程
當(dāng)隨著控制程序不斷升級的同時,Boot程序也會遇到升級的需求,單Boot模式下升級Boot程序有兩種方案。
1)利用APP空間升級:在APP 地址段內(nèi)開發(fā)一段BootPlus程序,專門刷寫B(tài)oot程序的一段代碼,先用Boot程序?qū)ootPlus刷寫進(jìn)去,然后跳轉(zhuǎn)到BootPlus,在Boot-Plus 程序中將最新的Boot程序刷寫進(jìn)去,然后再用新的Boot程序刷寫App程序。更新過程如圖2所示,在此過程中需要有2套上位機(jī)引導(dǎo)程序,分別是Boot程序更新APP地址區(qū)間的引導(dǎo)程序和BootPlus更新Boot地址區(qū)間段的引導(dǎo)程序,其中Boot程序更新APP的引導(dǎo)程序可以釋放整車廠或者是主機(jī)廠;BootPlus更新Boot地址區(qū)間的引導(dǎo)加在程序中因涉及到Boot程序更新,權(quán)限是最高的,應(yīng)管控在開發(fā)者范圍內(nèi),不允許外部任何其他人員有更新Boot程序的權(quán)限,以保證程序數(shù)據(jù)安全。

圖2 單Boot模式下程序升級
2)利用額外Flash或者RAM升級:利用額外的Flash空間,運(yùn)行原有的Boot程序,將新的Boot程序更新到額外的Flash中,重新運(yùn)行新的Boot程序,更新老的Boot程序,然后重新運(yùn)行Boot程序,破壞額外的Boot程序或者更新標(biāo)記位。
從兩種方案中,可以看出都是利用一段異于Boot程序的地址空間,刷寫一段能更新Boot程序的程序,將Boot程序更新,然后再用新的Boot程序更新應(yīng)用程序。
這兩種方案在更新過程中都需要做好安全校驗(yàn),以保證刷寫過程中的安全性,包含刷寫過程中的0x27服務(wù)的seed&key安全校驗(yàn),以及刷寫完畢后的程序數(shù)據(jù)完整性安全校驗(yàn)。
本文以嵌入式系統(tǒng)程序升級為例,因空間分配或架構(gòu)設(shè)計(jì)的原因,只能單Boot程序進(jìn)行,隨著功能的不斷完善,Boot程序會有更新的需求,當(dāng)單Boot程序下,有Boot程序更新需求的情況下,就需要利用其它空間進(jìn)行間接升級。本文中的兩種方案都是利用了這一原理,其中方案1是普遍采用的一種方案。為保證控制器內(nèi)程序和數(shù)據(jù)的安全,Boot程序的更新只保留在開發(fā)者權(quán)限范圍內(nèi),并通過高級別的加密算法進(jìn)行高效校驗(yàn),保證程序和數(shù)據(jù)的安全。