一、BOOT來源
你有沒有遇到過電腦新安裝了軟件,然后提示你Reboot的場景?這里的Reboot,大家都知道是重啟,而Boot就是啟動的意思。但你有沒有想過為什么電腦啟動會叫做Boot? Boot不是靴子嗎?
Boot作為啟動術語的來源確實與靴子有關。因為計算機的啟動都是從硬件上電開始的,此時軟件還沒工作,需要一個引導程序把它拉起來。而拉起軟件的動作又需要軟件自身的啟動和運行,這個過程就很像一句英文諺語:
Pull oneself up by one's bootstraps.
意思是通過鞋帶把自己提起來,寓意自食其力,靠自己振作起來。由于兩者思想如出一轍,計算機發展初期就把啟動的引導程序稱作BootStrap Loader,或Bootloader或Boot。
圖1:用鞋帶把自己拉起來的示意圖
二、Bootloader簡介
圖2:Bootloader示意圖
三、Flash Bootloader
實際上,Flash Bootloader應該算是Bootloader引導后的第二道程序。第一道被引導起來的Bootloader會判斷ECU狀態,再根據這個狀態來拉起應用程序或者進入Flash Bootloader。由于簡略表達或者概念模糊,在實際工作場合中很多時候都會聽到有人把Bootloader和Flash Bootloader混為一談。我們可以根據場合保持溝通的連貫性,但心里應該清晰區分兩者的區別。

圖3:Flash Bootloader與內存關系示意框圖
PBL的作用是在應用軟件有效時引導它。PBL存儲在MCU芯片的Flash,它一般是產品出廠時一次性刷好的,芯片上電或重啟后,第一批執行的代碼就是PBL。需要刷寫軟件時,PBL可以通過統一診斷服務(UDS),基于CAN或以太網等底層總線協議與外界診斷儀通信。在校核完診斷儀的權限后,PBL會將診斷儀上的SBL下載到MCU的內存RAM上,然后由SBL進行刷寫。SBL包含PBL提供的所有服務以及閃存驅動器(Flash Driver)和一些額外的UDS服務。通過UDS觸發,SBL會利用Flash Driver擦除舊軟件,并把新軟件寫到對應的存儲區。具體流程如下圖4所示:

圖4:MCU刷寫流程示意圖
為了避免應用軟件被意外誤刷寫或者刪除,PBL中一般不包含Flash Driver,不能直接操作閃存。每次刷寫時,包含Flash Driver的SBL都會從診斷儀中重新加載到內存。這種PBL和SBL的分工方案,有這些好處:
1.平時防止應用軟件被誤刷寫。
2.提高網絡安全性。每次從診斷儀下載SBL時,都可以通過安全鑒權機制,確保合法的診斷儀才能觸發刷寫。
3.通過SBL還能反向刷寫更新PBL,提高了Bootloader的整體靈活度。
四、SoC的啟動和刷寫
上面說的Flash Bootloader是針對傳統高度嵌入式系統的。但相信各位汽車同仁也感受到,越來越多的高性能計算芯片正在汽車上普及,汽車中央電腦等方案也是不絕于耳。對于這些高性能計算芯片,行業內常以SoC(System on Chip)相稱。SoC的啟動和刷寫方案和MCU如出一轍,但由于其內部存儲管理系統和內部總線更加復雜,啟動的具體實現與MCU略有差異,其細節更接近于我們熟悉的個人電腦。總體的啟動流程如下圖所示。

圖5:BIOS和UEFI啟動流程示意圖
傳統計算機的啟動一般采用上圖上部分的BIOS啟動。BISO是Basic Input Output System的縮寫,是計算機硬件與軟件第一次相遇的地方。BIOS的代碼通常被嵌入到電腦的主板的EEPROM中。BIOS可以完成計算機上電后的基本自檢,并指示計算機如何執行基本功能,如啟動和鍵盤控制。在BIOS中也可以選擇配置啟動參數。對,這就是我們以前重裝電腦系統時,在BIOS里可以選擇從光盤還是硬盤啟動等操作的原因。然后BIOS會調用硬盤起始位置的MBR(Master Boot Record),然后按照其中的分區表拉起Bootloader,然后是操作系統內核,再到操作系統和應用。
當然BIOS的設計已經有年頭了。現在生產的電腦基本都是使用UEFI(Unified Extensible Firmware Interface),汽車上的高性能計算單元也一樣。從實現功能上來看,UEFI可以認為是升級版的BIOS。
UEFI是一個微型操作系統,它在內存中加載Bootloader,再執行額外的操作程序。作為微型操作系統,UEFI運行在固件之上,可以支持的功能比BIOS多得多,包括系統驗證等安全功能。其中最核心的區別是,UEFI支持更大的尋址空間,并且可以在32位或64位模式下運行(BIOS只支持16位),也就是UEFI可以支持更大的硬盤或者網絡共享,并且啟動速度更快。

圖6:A/B分區升級示意圖
五、車載控制器啟動的挑戰
新年伊始,萬象更新。每年的開始階段對這一整年的影響都舉足輕重。對車載控制器的啟動來說也是類似,好的開始是成功的一半。正是由于啟動的重要性,也有不少挑戰要通過啟動過程來解決。其中最突出的就是關于信息安全和啟動時間的挑戰。
啟動的信息安全挑戰
圖7:一種MCU和SoC安全啟動方案的示意圖
啟動時長的挑戰
車載業務對于啟動時間又非常敏感。例如當下大家都習慣的倒車影像,我們通常坐上車、系好安全帶、發動車輛掛倒擋,就希望影像能夠出現在中控屏。試想如果整個啟動時長需要1分鐘,那我們就需要在車上等待幾十秒,或者脫離輔助功能“盲開”出去了,這樣的用戶體驗會很差。
為了迎接這個挑戰,車載域控制器或計算平臺經常會引入休眠模式。這也類似我們電腦的休眠模式,就是讓原本掉電丟失的內存上的內容先存儲到硬盤里,下次啟動時再將所有內容重新加載到內存上,而不是采用重新從UEFI加載Bootloader到內核再初始化的那一套流程。這樣控制器技能長時間保持低功耗,又能在需要喚醒時能夠快速啟動工作。當然,這需要耗費硬盤上的額外空間來存儲休眠時的內存數據。以下圖Windows 8的示意圖為例,傳統冷啟動需要耗費大量的時間來初始化系統,但是從休眠模式中啟動時,只需把硬盤中的休眠數據(Hiberfile)加載到內存,就可以開始用戶登錄了。
圖8:Windows 8冷啟動和從休眠中的啟動時長對比示意圖
而除了休眠模式,控制器還可以通過優化安全啟動策略縮短啟動時長。有些情況下,可以允許控制器先拉起Bootloader,操作系統和應用,并記錄其啟動的簽名、指紋等關鍵數據。待系統工作后,TEE會在后臺再次校驗已經啟動的系統是否合法,如果非法則進入相應的安全模式。這種做法比先驗證再啟動的方案會損失安全性,但是能縮短啟動時長。基于整車網絡安全架構的分析,可以讓部分較為安全的控制器(例如不與外網直接通訊的本地控制器)采用這種策略。
當然,產品的發展都是多維度而不是單一維度的。車載控制器的啟動過程也應該按照多維度標準去取舍和開發。這就像當年傳統非智能手機的啟動時間是很快,也很安全,沒有那么多病毒。但還是被現在啟動時間更長、安全風險更大的智能手機所取代了。春節期間大家在家看的智能電視也是一個道理。在汽車智能化的大趨勢下,啟動過程相信也會不斷平衡,做得更加智能、高效、安全。
轉自汽車電子與軟件