汽车电子与软件

汽车电子与软件

关注

聊一聊汽车控制器的启动 ——BOOT

环形隧道

2023-01-30

作者 | 万利

BOOT 来源

你有没有遇到过电脑新安装了软件,然后提示你 Reboot 的场景?这里的 Reboot,大家都知道是重启,而 Boot 就是启动的意思。但你有没有想过为什么电脑启动会叫做 Boot? Boot 不是靴子吗?

Boot 作为启动术语的来源确实与靴子有关。因为计算机的启动都是从硬件上电开始的,此时软件还没工作,需要一个引导程序把它拉起来。而拉起软件的动作又需要软件自身的启动和运行,这个过程就很像一句英文谚语:

Pull oneself up by one's bootstraps.

意思是通过鞋带把自己提起来,寓意自食其力,靠自己振作起来。由于两者思想如出一辙,计算机发展初期就把启动的引导程序称作 BootStrap Loader,或 Bootloader 或 Boot。

图 1:用鞋带把自己拉起来的示意图

Bootloader 简介

Bootloader,又称为引导程序,对操作系统非常重要,是计算机和汽车控制器的一个关键组成部分。然而,因为它往往在后台发挥作用,它经常被忽视。那么 Bootloader 的具体工作原理是怎样的呢?我们以下图中的 PIC16 单片机作为例子来具体看看。

按单片机设计,芯片通电后就会从 Flash 的 0x000 地址开始执行指令,也就是说芯片上电后,第一行代码就从 0X000 开始执行。如左所示,用户可以通过 UART 串口将整个用户程序烧录到 Flash 上,这样整个存储区都可以用于用户程序。但是每次烧写都很麻烦。如右所示,如果在 0X000 开始布置三行指令,用于跳转到 Bootloader 区(即下图右方的跳转 1),然后在 0XF00 区域开始执行 Bootloader 引导程序,正常启动时,Bootloader 执行完会再跳转到用户程序(即下图右方的跳转 2)。在 Bootloader 程序中,可以进行特殊的开发例程或者刷写新的用户程序,这样对开发和刷写都更加友好。

图 2:Bootloader 示意图

不同处理器的具体 Bootloader 细节略有差异,但是整体逻辑和思路都是相同的。例如对于电脑上的 CPU,Bootloader 还会初始化硬件,将操作系统内核从硬盘加载到内存,再将操作系统从加载到内存,然后操作系统会进一步将需要运行的应用程序从硬盘加载到内存中执行。总的来说,就是处理器硬件启动后自动执行的第一行代码会跳转到 Bootloader,然后再由 Bootloader 引导执行用户代码。

Flash Bootloader

如上文所述,Bootloader 的优势主要是为用户软件的刷写提供便利性。而汽车上传统的控制器都是高度嵌入式系统,而且各个控制器从开发到量产到售后都有软件更新的需求,Bootloader 刚好就能用来完成刷写控制器软件的任务。这个以刷写更新软件为目的的 Bootloader 在汽车行业就被广泛称之为 Flash Bootloader(FBL)。它主要用于 MCU 等传统嵌入式系统的软件刷写。

实际上,Flash Bootloader 应该算是 Bootloader 引导后的第二道程序。第一道被引导起来的 Bootloader 会判断 ECU 状态,再根据这个状态来拉起应用程序或者进入 Flash Bootloader。由于简略表达或者概念模糊,在实际工作场合中很多时候都会听到有人把 Bootloader 和 Flash Bootloader 混为一谈。我们可以根据场合保持沟通的连贯性,但心里应该清晰区分两者的区别。

在汽车行业的实际应用中,Bootloader 还常细分为 Primary Bootloader(PBL)和 Secondary Bootloader(SBL)。其中 SBL 更加接近于 Flash Bootloader。下图是一种常见的 PBL、SBL 和 MCU 存储器的关系示意图。

图 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 可以支持更大的硬盘或者网络共享,并且启动速度更快。

由于 SoC 一般采用基于文件系统的操作系统,可以通过文件系统升级软件,再加上 UEFI 具有更灵活的启动分区引导,所以车上的高性能计算平台一般还支持 A/B 分区升级。也就是在 A 系统运行时,悄悄升级冗余的 B 系统,完成安装升级后再重启 SoC,然后再切换到 B 系统。其总体过程如下图所示。

图 6:A/B 分区升级示意图

车载控制器启动的挑战

新年伊始,万象更新。每年的开始阶段对这一整年的影响都举足轻重。对车载控制器的启动来说也是类似,好的开始是成功的一半。正是由于启动的重要性,也有不少挑战要通过启动过程来解决。其中最突出的就是关于信息安全和启动时间的挑战。

启动的信息安全挑战

一年之计在于春。试想如果有人把你给孩子春节期间立下的 flag 偷偷换掉,然后你孩子还按照这个假的 flag 执行,如果 flag 是恶意的,那问题是不是大了?对车载控制器来说也是类似,启动过程中加载的 Bootloader 或者操作系统如果是被恶意替换了,不就破防了?

为了迎接这个挑战,在启动过程中,会引入安全启动(secure boot)机制。其目的是在系统启动之前先验证系统签名的合法性,从而判断将要启动的系统的合法性。如果系统合法,则继续加载拉起系统,如果非法则报错或自动回滚到上一个合法系统。由于传统嵌入式 MCU 和高性能计算芯片 SoC 的架构区别,二者在实施安全启动时也略有差别。如下图所示,MCU 一般会使用内嵌的 HSM(Hardware Security Module,硬件安全模块)来存储密钥和验证签名。而 SoC 一般会使用 TEE(Trusted Execution Environment,可信执行环境)架构来获取密钥和验证签名。两者在安全层面根据芯片架构采用不同策略,但是其目的和效果都是一样的。

图 7:一种 MCU 和 SoC 安全启动方案的示意图

启动时长的挑战

随着车载计算平台的发展,其所需要管理的硬件资源越来越丰富,也越来越复杂。这让控制器启动时需要加载的数据越来越大,需要初始化的设备也越来越多,导致其启动时长也越来越长。这就像 20 年前的诺基亚手机开机可能只需要几秒钟,现在智能手机开机则要几十秒甚至一分钟以上。据行业观察,当下流行的几款 SoC 正常启动时长很少少于 10 秒钟,如果加上安全启动等过程,则启动时长更长。有些控制器甚至从上电到上层功能业务应用开始工作,需要差不多 1 分钟。

车载业务对于启动时间又非常敏感。例如当下大家都习惯的倒车影像,我们通常坐上车、系好安全带、发动车辆挂倒挡,就希望影像能够出现在中控屏。试想如果整个启动时长需要 1 分钟,那我们就需要在车上等待几十秒,或者脱离辅助功能 “盲开” 出去了,这样的用户体验会很差。

为了迎接这个挑战,车载域控制器或计算平台经常会引入休眠模式。这也类似我们电脑的休眠模式,就是让原本掉电丢失的内存上的内容先存储到硬盘里,下次启动时再将所有内容重新加载到内存上,而不是采用重新从 UEFI 加载 Bootloader 到内核再初始化的那一套流程。这样控制器技能长时间保持低功耗,又能在需要唤醒时能够快速启动工作。当然,这需要耗费硬盘上的额外空间来存储休眠时的内存数据。以下图 Windows 8 的示意图为例,传统冷启动需要耗费大量的时间来初始化系统,但是从休眠模式中启动时,只需把硬盘中的休眠数据(Hiberfile)加载到内存,就可以开始用户登录了。

图 8:Windows 8 冷启动和从休眠中的启动时长对比示意图

而除了休眠模式,控制器还可以通过优化安全启动策略缩短启动时长。有些情况下,可以允许控制器先拉起 Bootloader,操作系统和应用,并记录其启动的签名、指纹等关键数据。待系统工作后,TEE 会在后台再次校验已经启动的系统是否合法,如果非法则进入相应的安全模式。这种做法比先验证再启动的方案会损失安全性,但是能缩短启动时长。基于整车网络安全架构的分析,可以让部分较为安全的控制器(例如不与外网直接通讯的本地控制器)采用这种策略。

当然,产品的发展都是多维度而不是单一维度的。车载控制器的启动过程也应该按照多维度标准去取舍和开发。这就像当年传统非智能手机的启动时间是很快,也很安全,没有那么多病毒。但还是被现在启动时间更长、安全风险更大的智能手机所取代了。春节期间大家在家看的智能电视也是一个道理。在汽车智能化的大趋势下,启动过程相信也会不断平衡,做得更加智能、高效、安全。

参考来源:

1.https://buildstorm.com/blog/automotive-bootloader-fbl/

2.https://www.embitel.com/blog/embedded-blog/what-is-flash-bootloader-and-nuances-of-an-automotive-ecu-re-programming

3.https://baike.baidu.com/item/Bootloader/8733520

4.http://www.oz1bxm.dk/PIC/bootloader.htm

5.https://www.timesys.com/security/secure-boot-snapdragon-410/

本文著作权归作者所有,并授权 42 号车库独家使用,未经 42 号车库许可,不得转载使用。

评论 · 0

0/3
大胆发表你的想法~
评论