从现象到本质,彻底搞懂U-Boot env存储机制

理财派对 2026-05-20 阅读:24218

前言:

瑞芯微平台的项目开发中,不少工程师都踩过这样一个“诡异”的坑:setenv改完、saveenv也保存了,重启设备后环境变量却莫名地回到了默认值。本文将带你从现象到本质,彻底搞懂U-Boot环境变量的存储机制,并给出完整的配置方案。

一、问题复现

日常开发调试时,我们会需要修改 U-Boot 环境变量(比如调整启动延时bootdelay、修改启动命令),操作步骤很简单,举个例子:

1. 设备上电,串口按Ctrl+C进入 U-Boot 命令行;

2. 查看当前变量:printenv;

从现象到本质,彻底搞懂U-Boot env存储机制

3. 修改目标变量(示例改启动延时为 3 秒):setenv bootdelay 3;

4. 保存配置:saveenv,提示保存成功;

从现象到本质,彻底搞懂U-Boot env存储机制

5. 重启设备,再次printenv——修改完全消失,变回默认值!

从现象到本质,彻底搞懂U-Boot env存储机制

问题的本质在哪里?

二、根因分析

要理解这个现象,需要先搞清楚U-Boot环境变量的存储机制。U-Boot在编译时通过一系列CONFIG宏来决定环境变量的存储位置,而瑞芯微平台的SDK默认配置是:

CONFIG_ENV_IS_NOWHERE

这个配置的语义非常直白——环境变量“无处可存”,这个配置下,环境变量仅存在内存中,saveenv只是临时写入内存,断电 / 重启后内存数据清空,变量自然恢复默认,这就是修改失效的根源。

想要永久保存变量,必须开启存储介质持久化配置,瑞芯微平台常用且推荐以下选项:

配置宏 存储介质
CONFIG_ENV_IS_IN_MMC eMMC / SD卡
CONFIG_ENV_IS_IN_NAND NAND Flash
CONFIG_ENV_IS_IN_SPI_FLASH SPI Flash
CONFIG_ENV_IS_IN_BLK_DEV BLK框架层设备(RK平台推荐)

因此对于瑞芯微平台,尤其是使用eMMC作为存储介质的场景,推荐启用CONFIG_ENV_IS_IN_MMC,将环境变量直接写入eMMC的指定扇区,实现真正的持久化存储

三、解决方案

眺望电子的瑞芯微系列核心板均使用 EMMC 颗粒存储,打开CONFIG_ENV_IS_IN_MMC,搞定永久保存。

3.1开启Uboot核心配置

在U-Boot的配置中,关闭CONFIG_ENV_IS_NOWHERE,并启用:

CONFIG_ENV_IS_IN_MMC

同时需要关注两个关键参数:

CONFIG_ENV_OFFSET 0x3f8000 // 环境变量在eMMC中的起始偏移地址CONFIG_ENV_SIZE 0x8000 // 环境变量占用空间大小(默认32KB)

注意:CONFIG_ENV_OFFSET和CONFIG_ENV_SIZE的具体值需要根据你的分区表和固件布局来确认。后续配置fw_env.config时也会用到这两个值,务必保持一致。

完成上述配置后重新编译U-Boot并烧录,此时通过setenv + saveenv修改的环境变量就会被写入eMMC,重启后依然有效。

3.2Linux 用户空间操作环境变量

开发后期,不想反复进 U-Boot 命令行,可在 Linux 系统下用fw_printenv/fw_setenv工具直接读写 EMMC 中的 U-Boot 环境变量,使用前需要确保:

已启用 CONFIG_ENV_IS_IN_MMC(否则工具读取不到有效数据)

正确配置 fw_env.config

在U-Boot源码目录下执行:

./make.shenv

从现象到本质,彻底搞懂U-Boot env存储机制

执行命令后生成文件

从现象到本质,彻底搞懂U-Boot env存储机制

此处需要配置env文件,匹配 EMMC 偏移和大小

git diff fw_env.configdiff --git a/u-boot/tools/env/fw_env.config b/u-boot/tools/env/fw_env.configindex 7916ebd..fd2f7aa 100644--- a/u-boot/tools/env/fw_env.config+++ b/u-boot/tools/env/fw_env.config@@ -8,8 +8,8 @@# NOR example# MTD device name Device offset Env. size Flash sector size Number of sectors-/dev/mtd1 0x0000 0x4000 0x4000-/dev/mtd2 0x0000 0x4000 0x4000+#/dev/mtd1 0x0000 0x4000 0x4000+#/dev/mtd2 0x0000 0x4000 0x4000# MTD SPI-dataflash example# MTD device name Device offset Env. size Flash sector size Number of sectors@@ -23,7 +23,7 @@# end of the device/partition, rather than a forwards offset from the start.# Block device example-#/dev/mmcblk0 0xc0000 0x20000+/dev/mmcblk0 0x3f8000 0x80000#/dev/mmcblk0 -0x20000 0x20000# VFAT example

编译后将fw_env.config 移动到板子的/etc 路径下;

将fw_printenv 移动到板子的/usr/local/bin 路径下;

后续可用该工具进行boot的变更,进行fw_printenv 操作前需要先进行fw_printenv 的软连接

ln-s /usr/bin/fw_printenv /usr/bin/fw_setenv

fw_printenv 查看某个变量:

fw_printenvbootdelay

使用fw_setenv设置环境变量 :

fw_setenvbootdelay3fw_printenv

删除一个环境变量:fw_setenv 变量 后不带参数即为删除该变量

fw_setenvbootdelay

注意:如果配置了CONFIG_ENV_IS_IN_MMC 配置,系统启动时会从emmc中读取env信息,此处EMMC的env信息并不会随着烧录而进行更改 将会永远保持不变。

可以通过瑞芯微的擦除所有扇区工具进行清除,清除该EMMC的env信息之后,后续初次重启将会变为默认的env信息。

从现象到本质,彻底搞懂U-Boot env存储机制

四、进阶操作

如果需要固件携带一组默认的环境变量,而不是依赖首次启动后的手动配置,那如何从源码中进行环境变量的更改呢???

要想从源码目录进行参数的更改需要进行如下操作:

默认环境变量定义在:

u-boot/include/env_default.h

找到default_environment数组,这里列出了所有编译期固化的环境变量。例如,修改bootdelay的默认值,可以找到:

从现象到本质,彻底搞懂U-Boot env存储机制

"bootdelay="__stringify(CONFIG_BOOTDELAY)"\0"

然后修改对应的CONFIG_BOOTDELAY配置即可。

从现象到本质,彻底搞懂U-Boot env存储机制

如果需要添加全新的自定义环境变量,直接在数组中添加一行:

diff--git a/u-boot/include/env_default.h b/u-boot/include/env_default.hindex 853c290..446bfe6100644---a/u-boot/include/env_default.h+++b/u-boot/include/env_default.h@@-103,6+103,7@@ const uchar default_environment[]={#ifdefCONFIG_SYS_SOC "soc=" CONFIG_SYS_SOC "\0"#endif+ "YWF_ENV=" "2002""\0"#ifdefCONFIG_SILENT_CONSOLE "silent=enable\0"#endif

从现象到本质,彻底搞懂U-Boot env存储机制

"YWF_ENV=""2002""\0"

重新编译U-Boot后,这个新变量就会出现在默认环境变量中,用户依然可以通过setenv在运行时覆盖它。

从现象到本质,彻底搞懂U-Boot env存储机制

五、总结

瑞芯微 U-Boot 环境变量修改失效,核心就是关闭CONFIG_ENV_IS_NOWHERE、开启CONFIG_ENV_IS_IN_MMC,配合saveenv即可永久保存;

本文从日常调试用 U-Boot 命令行,批量维护改源码默认值,后期运维用 Linux 工具,三种场景全覆盖,掌握这一套配置逻辑,无论是开发调试还是量产维护,再也不用反复踩坑!

热门文章
  • 2025年1月北京房市数据大揭秘

    2025年1月北京房市数据大揭秘
    2025年1月,北京的新房和二手房网签量表现不同,新房签约103套,二手房签约101套。回顾过去几个月,北京的房屋交易数量有所变化,12月新房签约5322套,二手房21556套。而在11月和10月,新房和二手房的签约数量也有所不同。本文还提到北京的房价走势及各区域的房价情况,让购房者对市场变化有更清晰的认识。 2025年1月的北京房地产市场数据,显示出新房和二手房市场的不同表现,这种动态值得我们关注。作为中国首都,北京的房地产市场一直受到全国的关注。过去几个月的签约...
  • 特斯拉 Optimus 人形机器人试生产线亮相,马斯克称年底数千台将入驻工厂

    特斯拉 Optimus 人形机器人试生产线亮相,马斯克称年底数千台将入驻工厂
    在特斯拉 2025 年第一季度更新报告中,公司首次向外界展示了 Optimus 人形机器人试生产线。特斯拉表示,Optimus 的生产时间表保持不变,公司正朝着尽快生产出能够完成有用工作的首批人形机器人的目标迈进。 据IT之家了解,特斯拉的 Optimus 试生产线位于弗里蒙特工厂,这里是特斯拉众多项目的起点。公司希望在年底前将 Optimus 机器人的部署范围扩大到旗下更多工厂。 在特斯拉第一季度财报电话会议上,埃隆 马斯克分享了 Optimus 项目的最新进展:“...
  • 科创综指ETF南方(认购代码:589663)2月17日起正式开售

    科创综指ETF南方(认购代码:589663)2月17日起正式开售
      中国网财经2月7日讯 随着首批科创综指ETF正式获批,市场迎来科创板投资新工具。日前,南方基金发布公告,南方上证科创板综合ETF(简称:科创综指ETF南方;认购代码:589663)将于2月17日正式开售,有望为投资者布局"硬科技"赛道提供高效配置工具。   业内人士指出,随着科创板上市公司数量的提升,上证科创板综合指数的推出为科创板市场提供更丰富、更全面的投资工具,与现有的科创50、科创100、科创200 等规模指数形成互补,为投资者提供了一种便捷的投资科创板的方式,有...
  • 化工行业周报:丙烯酸等本周涨幅居前,赛轮ESG表现获肯定

    化工行业周报:丙烯酸等本周涨幅居前,赛轮ESG表现获肯定
    (以下内容从信达证券《化工行业周报:丙烯酸等本周涨幅居前,赛轮ESG表现获肯定》研报附件原文摘录) 本期内容提要: 基础能源(煤油气)价格回顾:截止2025/01/02,WTI原油价格为71.72美元/桶,周环比上涨1.27%;布伦特原油价格为74.64美元/桶,周环比上涨1.10%。截止2025/01/03,动力煤价格为662元/吨,周环比上涨0.61%;LNG价格为4527元/吨,周环比下跌0.64%。 基础化工板块市场表现回顾:本周(2024/12/27-2025/01...
  • 《2024年度中国慈善信托发展报告》解析(上):蓬勃发展与现存挑战

    《2024年度中国慈善信托发展报告》解析(上):蓬勃发展与现存挑战
      中国网财经3月3日讯 日前,中国信托业协会慈善信托专业委员会与中国慈善联合会慈善信托委员会联合发布《2024年度中国慈善信托发展报告》(简称《报告》)。这一连续八年发布的年度报告,不仅是对慈善信托行业发展的阶段性总结,更是洞察其未来走向的重要窗口。在过去的2024年,慈善信托领域呈现出诸多新变化,既有着令人瞩目的发展成果,也面临着一系列亟待解决的问题。   政策助力慈善信托发展态势良好   记者了解到,2024年9月新修订的《慈善法》正式实施后,为慈善信托的稳健发展筑...