uboot 运行过程中的存储分布图解

本文详细介绍了U-Boot启动过程中的三个关键阶段:第一阶段将8KB uboot从SD卡复制到SRAM中运行;第二阶段uboot被重新定位到DDR内存中,并设置栈,开始运行;第三阶段填充全局数据结构,为后续操作做准备。

(1)上电后,从SD自拷贝8KBuboot到SRAM中运行(uboot的第一阶段)

(2)uboot被重定位到DDR,并指定栈,并跳到DDR中开始运行第二阶段


(3)填充gd,bd,设置 堆 栈

<think>好的,用户想了解U-Boot环境变量的存储位置。首先,我需要回忆一下U-Boot的环境变量存储机制。根据之前的引用,特别是引用[1]提到bootcmd和bootargs是环境变量,而引用[2]和[3]讨论了设置这些变量的方法,包括使用单引号处理空格。这说明环境变量在存储时需要考虑格式和位置。 接下来,用户的问题是关于存储位置的详解。根据我的知识,U-Boot环境变量通常存储在非易失性存储器中,比如NOR Flash、NAND Flash、eMMC、SPI Flash或者EEPROM。不同的硬件平台可能选择不同的存储介质,这取决于具体的硬件设计。例如,有些嵌入式系统可能使用EEPROM来保存环境变量,因为它具有较高的耐用性和较小的容量需求。 另外,U-Boot的配置文件中会定义环境变量的存储位置,比如通过CONFIG_ENV_IS_IN_EEPROM、CONFIG_ENV_IS_IN_SPI_FLASH等宏来指定。需要检查板级配置文件或头文件中的这些配置选项,以确定具体的存储位置。存储区域的大小也是需要注意的,通常由CONFIG_ENV_SIZE定义,用户需要确保分区大小足够,避免数据溢出。 还有,环境变量的存储格式是键值对,可能带有CRC校验以保证数据的完整性。在启动时,U-Boot会从指定的存储位置读取环境变量到内存中,修改后再写回存储设备。如果存储介质出现坏块或损坏,可能导致环境变量加载失败,这时会使用默认值。 用户可能需要进一步了解如何查看和修改这些配置,或者在不同硬件平台上如何确定存储位置。因此,生成相关问题时应涵盖存储介质类型、配置方法、存储大小设置以及故障处理等方面,帮助用户全面理解环境变量的存储机制。</think>### U-Boot环境变量存储位置详解 U-Boot的环境变量存储位置与硬件平台和配置密切相关,主要涉及以下核心要点: #### 1. **存储介质类型** - **NOR/NAND Flash**:最常见存储位置,通过宏定义$CONFIG\_ENV\_IS\_IN\_FLASH$指定。例如,在NAND Flash中需分配独立分区[^1]。 - **eMMC/SD卡**:若使用$CONFIG\_ENV\_IS\_IN\_MMC$,环境变量通常存储在固定偏移地址处(如eMMC的第2个块)。 - **EEPROM**:通过$CONFIG\_ENV\_IS\_IN\_EEPROM$配置,适用于需要高频擦写的场景。 - **SPI Flash**:需启用$CONFIG\_ENV\_IS\_IN\_SPI\_FLASH$,常见于嵌入式SoC平台。 #### 2. **存储位置定义** - 具体地址和大小通过以下宏定义: ```c #define CONFIG_ENV_OFFSET 0x40000 // 存储起始偏移 #define CONFIG_ENV_SIZE 0x2000 // 环境变量区大小(8KB) ``` - 在NAND Flash中还需指定块大小对齐: ```c #define CONFIG_ENV_RANGE (CONFIG_ENV_SIZE * 2) // 防止坏块影响 ``` #### 3. **存储结构** - 环境变量以**键值对+CRC校验**形式存储,格式为: ``` var1=value1 var2=value2 ... CRC32=0x12345678 ``` - 启动时U-Boot会验证CRC校验和,若失败则加载默认环境变量[^4]。 #### 4. **运行时行为** - 环境变量在启动时从存储介质加载到**DDR内存**(地址由$CONFIG\_ENV\_ADDR$指定)。 - 执行`saveenv`命令时,会将内存中的环境变量写回存储介质,同时更新CRC校验值[^2]。 #### 5. **查看当前配置** 通过U-Boot命令行可查询实际存储位置: ```shell => bdinfo arch_number = 0x00000000 boot_params = 0x80000100 DRAM bank = 0x00000000 -> start = 0x80000000 -> size = 0x20000000 ethaddr = 00:40:5c:26:0a:5b ip_addr = 192.168.1.10 ... env_t = flash ``` 其中`env_t = flash`表明环境变量存储在Flash中[^4]。 #### 6. **典型配置示例(STM32MP157)** ```c // include/configs/stm32mp15.h #define CONFIG_ENV_IS_NOWHERE 0 #define CONFIG_ENV_IS_IN_MMC 1 #define CONFIG_SYS_MMC_ENV_DEV 1 // 使用mmc1设备 #define CONFIG_ENV_OFFSET (1024 * 1024) // 1MB偏移 #define CONFIG_ENV_SIZE (8 * 1024) // 8KB空间 ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值