固件升级机制
更新时间: 2026/04/16
在AtomGit上查看源码固件升级整体描述
固件升级动作主要包含启动固件升级和升级进度查询,其中启动固件升级分为两个场景,即本地升级和远程升级,实际的升级动作由实际的固件子模块完成,固件管理模块驱动完成整个固件升级流程,因此固件管理模块需要与固件子模块机型交互:
固件升级具体实现
固件升级阶段分为Initialize,prepare,process,和finish四个阶段,在两个阶段间插入公共处理动作,每个固件子模块包含prepare,process,和finish三个特有动作。
prepare
在接收到固件管理组件发送的prepare消息后,确认收到的消息是当前子模块的升级消息,判断是否允许升级,回复prepare结果。
process
- 升级包数据预处理。通过AES,CBC,128算法加密,解密并将升级数据写入bin文件;
- 写升级数据到flash。将bin文件打包写入flash,并最终输出到对应的分区;
- 设置M3标志位。设置BMC升级标志位。
finish
- 判断若first boot脚本存在,则执行该脚本;
- 给固件管理组件注册生效模式,生效动作由固件管理组件统一管理。 固件升级时序流程如下:
三个阶段都通过之后则升级成功,中间任意一个阶段收到固件子系统”升级失败“的结果,则认为此次升级失败,或者在规定时间段内固件子系统未回复固件管理阶段性结果,则认为超时失败。
固件生效
固件子模块感知到生效条件满足后,找固件管理模块进行裁决,由固件管理模块决定其是否能执行生效动作。基础的处理流程如下:
并行升级
并行升级流程
iBMC除了常用的升级方式单独升级固件以外,还配置了并行升级方式,具体的升级流程如下:
互斥处理
并行升级与串行升级互斥
升级流程(如固件生效)需串行执行,避免并发冲突。生效接口调用时,若已经在生效流程中,直接报错。
固件互斥规则
- 相同ComponentID和ComponentIDEx的固件不支持并行升级;
- 不同ComponentIDEx的固件可能支持并行,但需要业务组件在prepare阶段返回错误码;
- 硬件对象间(如管理板与接口卡)禁止并行升级;BMC必须优先升级且独立。
互斥处理
互斥场景(如加锁失败或者下游组件判断不支持并行升级)时,任务移动至队尾等待,不记录重试次数,相同ComponentID和ComponentIDEx的固件在升级时,新任务排队等待重试。
资源限制
- 并行任务上限:同时升级的固件数量通过CSR配置,默认上限为5;等待队列任务数默认任务上限为10,超限后新掉用报错。
- 存储队列管理:本地升级需要先缓存固件包,优先处理本地任务以释放资源。