uboot的环境变量
1、环境变量的作用
我们可以不用修改uboot的源代码,而是通过修改环境变量来影响uboot运行时的一些数据特征和特性。比如更改bootdelay、baudrate等环境变量时,不用到uboot源码去修改代码,然后重新编译下载,而是在终端下更改就行。如更改bootdelay:
2、环境变量的优先级
如果uboot代码当中有一个值,环境变量中也有一个值,那么uboot实际运行时要使用哪个值呢?规则是:如果环境变量为空则使用代码中的值,如果环境变量不为空中则优先使用环境变量对应的值。
3、环境变量在uboot的工作方式
(1)默认环境变量,在uboot/common/env_common.c中的default _environment,里面的内容由很多的环境变量连续分布组成,每个环境变量最末端以 '\0'结束。
(2)SD卡中的环境变量分区,raw_area_control是uboot中规划iNnad/SD卡的原始分区表。这个分区专门用来存储环境变量。如何存储? 就是把DDR中的环境变量整体写入到SD卡的分区里。当执行saveenv命令时,所有的环境变量都会重新被保存一遍,而不只是保存了当前更改的值。
(3)DDR中的环境变量,default_environment在uboot中其实就是一个全局变量,链接时在数据段,重定位时default_environment被重定位到DDR一个内存地址中。
总结:刚烧录的系统中环境变量分区是空白的,uboot第一次运行加载时是uboot代码中默认的环境变量。当我们执行saveenv命令时环境变量就会被更新保存到SD卡中,下次开机relocate环境变量时在sd卡的环境变量会被加载到DDR中去。default_environment之前虽然被uboot源代码初始化为一定的值,但是此时env_relocate代码会去判断SD卡中的env分区的CRC是否通过,如果crc校验通过说明SD卡中有正确的环境变量存储,则relocate函数会从SD卡中读取环境变量来覆盖default_environment字符数组,从而每次开机可以保持上一次更改过的环境变量。
4、环境变量在内存中的存储方式
1 | 1 | 1 | '\0' | 2 | 2 | 2 | '\0' | ... | .. | '\0' | .. | .. |
环境变量就是以字符数组形式存储在内存中,连续的排布着,每个环境变量最末端以‘\0’结束(大小为16kb)。