uboot的环境变量



1. uboot的环境变量及其操作

正如Windows其他操作系统一样,虽然uboot构不成操作系统,但它也有属于自己的环境变量,也就是全局变量。在进入uboot的命令行中,输入print可以打印uboot的所有全局变量及其值,下面是uboot的环境变量,由于没有增添过,所以都是默认的环境变量:
在这里插入图片描述


如上图,uboot默认环境变量共10个

  • bootargs是将来传递给内核的参数
  • bootcmd是uboot自启动时执行的命令(默认从启动介质指定扇区中读取kernel和根文件系统到指定内存地址处,远跳转执行kernel处代码,bootm 只会执行第一个地址)
  • mtdpart表示块设备分区,启动内核时会传递给它,具体传参过程详见uboot启动内核笔记,关于mtd设备介绍详见此链接
  • ethaddr表示网卡物理地址
  • ipaddr表示ip网络地址
  • netmask表示掩码地址,用于表示IP地址段
  • gatewayip表示网关地址
  • serverip表示服务器地址,这里的服务器指的是uboot在使用tftp或nfs传输协议时所用到的下载地址
  • baudrate表示波特率,这里说明一点,就算修改了这里的环境变量值,波特率有可能也不会变(已经测试过)
  • bootdelay表示的是开发板自启动时倒数时间,可以通过修改其值自定义启动时间

关于环境变量的操作十分简单,共有三条指令,打印(print/printenv),设置(set/setenv 变量名 [值]),保存(save/saveenv),至于删除也是set命令,只要不写值就是删除,写上就是修改。如果只设置不保存,开机后会使用原来的环境变量。

2. uboot环境变量分区

uboot有两套环境变量,一套是默认的在…/uboot/common/env_common.c 文件中,这些环境变量都是以字符串的形式存在的,他们被定义在一个default_environment[CFG_ENV_SIZE]字符串数组中。另一套在iNand环境变量分区,在uboot启动第二阶段会在环境变量重定位时获取,环境变量分区信息详细过程参考博客

3. uboot环境变量初始化流程

(1). env_init 函数初始化了gd->env_addr变量指向默认环境变量地址,初始化了gd->env_valid变量为1。
(2). mmc_initialize函数初始化了环境变量分区。
(3). env_relocate函数为全局变量env_ptr分配内存,执行env_relocate_spec函数。
(4). env_relocate_spec函数读取环境变量分区内容到全局变量env_ptr地址处,若环境变量分区没有内容,执行(6)。
(5). use_default 函数puts提示信息将默认环境变量内容填充到全局变量env_ptr地址处,置gd->env_valid变量为1。
(6). 置gd->env_addr地址指向env_ptr地址处。

<think>好的,用户想了解U-Boot环境变量的配置和使用示例。首先,我需要回忆一下U-Boot的基本知识,环境变量在U-Boot中的作用,以及如何操作它们。根据用户提供的引用内容,环境变量存储在flash中,默认值来自源代码,用户可以通过命令进行设置和保存。 首先,我应该解释什么是U-Boot环境变量,它们的作用是什么。然后,详细说明如何查看、设置、保存环境变量,并提供一些常见的使用示例,比如设置网络参数或启动命令。需要确保步骤清晰,命令正确,并且符合用户的实际操作需求。 用户可能想知道具体的命令语法,比如printenv、setenv、saveenv的使用方法。还要注意环境变量的优先级,当变量为空时使用默认值,否则使用用户设置的值。可能需要提到一些常见变量,如serverip、ipaddr、ethaddr、bootcmd和bootargs,这些在引用中都有涉及。 另外,用户可能需要示例来更好地理解,比如设置serverip的步骤,或者配置启动参数。需要确保示例准确,并且命令格式正确。同时,要注意用户可能的错误,比如忘记保存环境变量,导致重启后配置丢失,所以需要强调saveenv的重要性。 还要考虑用户可能遇到的问题,比如如何恢复默认设置,或者处理环境变量存储损坏的情况。可以简要提到这些情况,但主要焦点还是放在配置和使用示例上。 最后,根据用户的要求生成相关问题,这些问题应该与U-Boot环境变量的高级配置、存储位置、调试方法等相关,帮助用户进一步学习。</think>### U-Boot 环境变量的配置与使用详解 U-Boot 环境变量是嵌入式系统启动过程中用于存储配置参数的关键机制,其优先级规则为:若变量值为空则使用代码默认值,若已设置则优先使用用户定义值[^1]。以下从基础操作到典型场景逐步说明: #### 一、环境变量基础操作 1. **查看所有环境变量** ```bash => printenv baudrate=115200 bootcmd=run distro_bootcmd serverip=192.168.1.100 # 未设置时使用默认值 ``` 通过该命令可验证当前生效的变量值[^3]。 2. **设置/修改变量** ```bash => setenv serverip 192.168.1.100 => setenv bootdelay 3 # 修改启动等待时间 ``` 变量修改后仅在内存中生效,需执行保存操作才能持久化[^1]。 3. **保存到存储设备** ```bash => saveenv Saving Environment to SPI Flash... OK ``` 该操作将当前环境变量写入NOR Flash或eMMC等存储介质。 #### 二、典型配置场景示例 1. **网络参数配置** ```bash => setenv ipaddr 192.168.1.50 # 设备IP => setenv serverip 192.168.1.100 # TFTP服务器IP => setenv netmask 255.255.255.0 => saveenv ``` 这些参数直接影响`tftp`命令下载内核镜像等网络操作[^2]。 2. **MAC地址设置** ```bash => setenv ethaddr 00:0a:35:12:34:56 => saveenv ``` 注意:MAC地址首次设置后不可修改,需清除环境变量分区才能重置[^2]。 3. **自定义启动流程** ```bash => setenv bootcmd &#39;tftp 0x82000000 zImage; bootm 0x82000000&#39; => setenv bootargs console=ttyS0,115200 root=/dev/mmcblk0p2 => saveenv ``` `bootcmd`定义自动执行的启动命令,`bootargs`向内核传递参数[^2]。 #### 三、高级操作技巧 1. **多环境备份机制** 修改`envsize`和`envnumber`实现多份环境备份: ```bash => setenv envsize 0x20000 # 单个环境区大小 => setenv envnumber 2 # 双备份配置 => saveenv ``` 2. **环境变量恢复** ```bash => env default -f # 恢复所有默认值 => saveenv # 清除自定义设置 ``` 3. **脚本化配置** 通过`;`分隔多个命令实现批量配置: ```bash => setenv init_cmd &#39;setenv ipaddr 192.168.1.10; setenv serverip 192.168.1.100; saveenv&#39; => run init_cmd ``` #### 四、调试与验证 1. **变量值有效性检查** ```bash => env info env_valid = valid env_ready = true env_use_default = false ``` 该命令显示环境变量存储状态[^3]。 2. **Android系统读取验证** 通过`envtool`工具验证变量是否传递到系统层: ```bash # envtool r factory_test ubootenv init successful.(0) on ``` 这确认了U-Boot环境变量与Android系统的集成效果[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值