本文约1200字,结合我所做过的项目经验加AI补全的(低电压禁止写入)的保障措施来整理这道面试题的答法。
关注公众号, 即可获得与Linux相关的电子书籍以及常用开发工具,文末有文档清单。
我分四层说下双分区 OTA 切换整套可靠性保障措施,从下载、校验、写入、切换回滚完整流程。
1. 下载阶段:防止固件包损坏、中途断连
- 传输校验:OTA 包本身带 MD5 / SHA256 哈希,下载完先校验MD5/哈希,不对直接丢弃报错。
- 包大小校验:提前比对预期固件长度,避免半截残缺包写入备用分区,报错直接提示大小不对。
2. 写入备用分区:防止写坏 Flash、断电变砖
- 写之前擦除完整备用分区,不覆盖正在运行的主分区,系统全程跑旧分区,业务不中断
- NAND 用 UBI/UBIFS 自带坏块检测,写到坏块自动跳过
3. 切换标记 + 校验:不轻易切分区,多重验证再生效
固件完整写入备用分区后,不立刻切系统,做三层校验:
- 分区文件系统自检:UBIFS / SquashFS 超级块、索引完整性检查
- 内核镜像校验:zImage / Image 自带签名校验,防止篡改固件
- 产品自定义签名校验:后台固件带 RSA 签名,私钥服务器加密、设备公钥校验,拦截恶意包
三层全部通过后,只在独立分区(环境变量分区)写一个升级就绪标记,不改动正在跑的主分区。
4. 启动切换与自动回滚(最核心防砖机制)
设备重启进 U-Boot,先读升级标记:
- 启动成功、上层应用完全跑起来后,内核 / 应用清除升级标记、重置重试计数
- 一旦备用分区启动失败(内核崩溃、挂载失败、看门狗超时),重试次数用完,U-Boot 直接清空升级标记,永久切回原主分区,下次开机直接跑旧系统
- 分区互斥逻辑:主、备分区永远只激活一个,不会出现两个分区同时激活错乱
- 回滚不删旧固件:回滚后主分区完好可用,不用重新下载旧包
5. 兜底附加保障
- 独立小分区存升级状态标记,不和根文件系统共用,根分区损坏也能读切换标识
- 业务层增加升级风险提示:升级中途禁止关机、插拔电源
- 日志全留存:下载、写入、校验、启动失败日志存 Flash,出问题可定位哪一步失效
收尾总结
整套逻辑核心就是:
不动正在运行的系统、多重校验再标记、启动失败自动回滚
全程任意阶段断电、包损坏、固件异常都不会变砖。
精简口述短版(面试官让简短回答时用)
双分区 OTA 可靠性主要靠五步闭环保障:
- 下载完MD5/哈希、签名双重校验,过滤损坏和恶意固件
- 只写入备用分区,全程不改动当前运行系统,写的时候分块校验、底层屏蔽 Flash 坏块
- U-Boot 启动时做重试计数,新分区启动失败自动切回旧分区回滚
- 单独分区存升级状态,配合看门狗、低压保护、升级日志兜底,任何环节断电都不会变砖
附加说明:在双分区切换机制策略中,也可设计成运行分区损坏,从备份分区搬运数据到运行分区,确保系统可正常运行。不用从运行分区和备份分区来回切换的方法。
往期文章(欢迎订阅技术分享栏目全部文章):
这里是女程序员的笔记本
15年+嵌入式软件工程师兼二胎宝妈
分享读书心得、工作经验,自我成长和生活方式。
希望我的文字能对你有所帮助