一.uboot的环境变量简介
u-boot的缺省情况下会有一些基本的环境变量,当执行saveenv时,环境变量会保存到flash存储设备中。
- 环境变量的优先级
如果环境变量的值为空,则uboot会使用uboot代码中的值;如果环境变量不为空,则优先使用环境变量的值。
默认环境变量在uboot源码中common/Env_common.c文件中。
- 实现代码
所有的环境变量存储在一个16KB大小的一维数组中,每个环境变量以”\0”结束。
uboot在启动时,在遍历调用执行init_sequence函数指针数组中的env_init函数时已经对环境变量进行校验,通过调用env_relocate函数,将环境变量从Flash启动设备重定位到SDRAM中。uboot启动时环境变量的初始化如下:
(具体参考八.linux开发之uboot移植(八)——uboot源码分析2-启动第二阶段之start_armboot函数分析)
环境变量有2份,一份在Flash中,另一份在DDR中。uboot开机时一次性从Flash中读取全部环境变量到DDR中作为环境变量的初始化值,然后使用过程中都是用DDR中这一份
bootdelay | 执行自动启动(bootcmd中的命令)的等候秒数 |
---|---|
baudrate | 串口控制台的波特率 |
netmask | 以太网的网络掩码 |
ethaddr | 以太网的MAC地址 |
bootfile | 默认的下载文件名 |
bootargs | 传递给Linux内核的启动参数 |
bootcmd | 自动启动时执行命令 |
serverip | TFTP服务器端的IP地址 |
ipaddr | 本地的IP地址 |
stdin | 标准输入设备,一般是串口 |
stdout | 标准输出,一般是串口,也可是LCD(VGA) |
stderr | 标准出错,一般是串口,也可是LCD(VGA) |
二.环境变量相关命令源码解析1
1、printenv环境变量对应函数(打印出环境变量的功能)
(1)找到printenv命令所对应的函数。通过printenv的help可以看出,这个命令有2种使用方法。
第一种直接使用不加参数则打印所有的环境变量;第二种是printenv name则只打印出name这个环境变量的值。
(2)分析do_printenv函数。
(3)argc=1时用双重for循环来依次处理所有的环境变量的打印。第一重for循环就是处理各个环境变量。所以有多少个环境变量则第一重就执行循环多少圈。