u-boot bootloader如何读取/保存其环境变量?

时间:2013-12-11 17:17:58

标签: linux arm u-boot

  • u-boot bootloader如何读取/保存其环境变量?
  • 我们如何在Flash中声明u-boot环境变量部分的地址?

  • 来自here的说明: U-Boot环境是一块内存块,在U-Boot启动时保存在持久存储上并复制到RAM中。

复制到RAM ”是什么意思?

U-boot会将环境变量的内存块复制到RAM吗?

由于

2 个答案:

答案 0 :(得分:9)

是的,U-boot会将环境变量的内存块复制到RAM中。

块来自的持久存储是特定于平台的。一些常见的存储选项(以及处理该存储选项的源文件):

NOR flash   env/flash.c
SPI flash   env/sf.c
MMC         env/mmc.c

include / configs / yourboard.h中的CONFIG_定义将确定详细信息。例如,对于映射在内存顶部的SPI闪存,可能是:

#define CONFIG_ENV_IS_IN_SPI_FLASH
#define CONFIG_ENV_SIZE    0x00001000
#define CONFIG_ENV_ADDR    0xFFFFF000

CONFIG_ENV_ADDR是u-boot环境的地址Flash中的变量部分。

请注意,在将环境写入持久存储时,u-boot会自动在此部分创建CRC32。在启动时读取环境时检查CRC。如果没有通过CRC校验,则不使用存储的环境;而是使用硬编码到程序代码中的新默认环境,这是一种特殊情况。

在U-Boot初始化期间,环境变量被导入到哈希表中。在操作中,所有读/写操作,以及所有" printenv" (显示环境变量)和" setenv" (设置环境变量)命令使用这些表条目。在命令" saveenv"之前,任何更改都是未保存的。完成,写入持久存储。

有关详细信息,请参阅u-boot/common/cmd_nvedit.c第14-24行和u-boot/README第3474-3881行(行号适用于v2013.10)。

答案 1 :(得分:6)

env变量块的地址和大小将在board头文件中定义。例如,请参阅include/configs/am3517_evm.h

#define CONFIG_SYS_ENV_SECT_SIZE        (128 << 10)     /* 128 KiB */
#define CONFIG_ENV_OFFSET               SMNAND_ENV_OFFSET
#define CONFIG_ENV_ADDR                 SMNAND_ENV_OFFSET

u-boot从CONFIG_SYS_ENV_SECT_SIZE加载SMNAND_ENV_OFFSET。您可以更改值,然后通过saveenv保存它们。