【问题标题】:How u-boot bootloader reads/saves its environment Variables?u-boot bootloader 如何读取/保存其环境变量?
【发布时间】:2013-12-29 19:31:38
【问题描述】:
  • u-boot bootloader 如何读取/保存其环境变量?
  • 我们如何在Flash中声明u-boot环境变量部分的地址?

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

复制到内存”是什么意思?

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

谢谢

【问题讨论】:

    标签: linux arm u-boot


    【解决方案1】:

    是的,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)。

    【讨论】:

    • @Joe Kul,谢谢。如果 u-boot 将环境变量的内存块复制到 RAM。那么我们在 RAM 中哪里定义了这部分的地址呢?我很惊讶为什么 u-boot 不直接从闪存读取和导入其 env 部分到 哈希表,而是需要复制到 RAM 然后稍后导入?
    • U-Boot 几乎可以复制从闪存到 RAM 的所有内容。这就是所谓的“搬迁”。要获取来自闪存的任何内容在 RAM 中的地址,您可以将“重定位偏移”(在控制台打印)添加到 u-boot.map 中的闪存位置。另请参阅 arch/arm/lib/board.c。但搬迁是一个单独的话题。
    • @Joe Kul:我不知道 u-boot 需要“重新定位”。对于我的系统,boostrap 将 u-boot 加载到 RAM,所以我认为 u-boot 只需要读取环境变量块而不需要重新定位。实际上,我的 u-boot 是二进制映像,所以它不能执行任何重定位。谢谢
    • U-Boot 会自行重新定位,无论是否需要。
    • @Joe Kul:U-boot 仅在检测到它在 ROM/Flash 上运行时才会重新定位。否则,如果 u-boot 在 RAM 中运行,则将跳过重定位。重定位的主要任务是将u-boot映像从Flash/ROM复制到RAM,然后开始从RAM执行程序以获得更快的执行速度。我没看错,然后重定位代码在函数 board_init_f (/arm/lib/board.c) 上,它将调用程序集句柄 relocation_code 。所以,我认为这与“u-boot 如何将 Flash 中的 env 块复制/处理到 RAM 中的方式不同?”
    【解决方案2】:

    环境变量块的地址和大小将在板头文件中定义。参见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 从SMNAND_ENV_OFFSET 加载CONFIG_SYS_ENV_SECT_SIZE。您可以更改值,然后通过saveenv 保存它们。

    【讨论】:

      猜你喜欢
      • 2016-08-27
      • 2014-01-04
      • 1970-01-01
      • 2018-04-12
      • 2017-12-01
      • 1970-01-01
      • 2020-05-05
      • 2015-05-18
      • 1970-01-01
      相关资源
      最近更新 更多