本文基于u-boot.2016.03.
1、环境变量的作用
uboot中环境变量的作用就是在不改变源码、不用重新编译的情况下,可以使我们通过设置环境变量来使得代码有不同表现,如bootdelay时间、IP地址,向内核的传参bootargs等等,有些环境变量要重启后才能生效使用,有些设置后马上可以使用新设置的值了。
2、常用的环境变量
常用的环境变量定义在一个结构体中,每个环境变量由变量名,等于符号,变量内容,和"\0"组成。
/include/env_default.h
const uchar default_environment[] = {
...
#ifdef CONFIG_BOOTARGS
"bootargs=" CONFIG_BOOTARGS "\0"
#endif
#ifdef CONFIG_BOOTCOMMAND
"bootcmd=" CONFIG_BOOTCOMMAND "\0"
#endif
...
#ifdef CONFIG_EXTRA_ENV_SETTINGS
CONFIG_EXTRA_ENV_SETTINGS
#endif
...
};
环境变量 | 描述 |
---|---|
bootargs | 传给内核的启动参数 |
bootcmd | 自启动时执行的命令 |
bootdelay | 执行自动启动的等候秒数 |
baudrate | 串口控制台的波特率 |
ipaddr | 本机的IP地址 |
serverip | 服务器端的IP地址 |
gatewayip | 本机网关 |
netmask | 子网掩码 |
arch | 架构(arm) |
vendor | 芯片厂(freescale) |
这里的 CONFIG_EXTRA_ENV_SETTINGS比较特殊,一般在板级文件里定义。
我们这里使用的是sabreauto的参考开发板,这个宏定义在mx6sabre_common.h中定义。
3、代码分析
主要涉及的文件有:
common/board_f.c//uboot启动时比较靠前的初始化工作
common/board_r.c//uboot启动时比较靠后的初始化工作
common/env_common.c// 中间层实现
cmd/nvedit.c//命令层实现
common/env_flash.c//驱动层实现(以eimnor为例)
lib/Hashtable.c //哈希表实现
3.1 顺序结构:
3.2 分层结构:
uboot中env的整个架构可以分为3部分: