• uboot学习之七---uboot的环境变量


    环境变量的作用
    环境变量的优先级
    uboot代码当中有一个值,环境变量中也有一个值。uboot程序实际运行时规则是:如果环境变量为空,则使用代码中的值;如果环境变量不为空则优先使用环境变量对应的值

    比如machid机器码,uboot在x210_sd.h中定义了一个机器码2456,写死在程序中,如果要更改要修改源代码,并且重新编译。比较简单的方式是使用环境变量machid。set machid 0x998,有了环境,系统则优先使用环境变量中的值。这就是优先级的问题

    环境变量在uboot中的工作方式
    ((1)默认环境变量,在uboot/common/env_common.c中default_environment,这东西本质是一个字符数组,大小为CFG_ENV_SIZE(16kb),里面内容就是很多个环境变量连续分布组成的,每个环境变量最末端以''结束。

    (2)SD卡中环境变量分区,在uboot的raw分区中。SD卡中其实就是给了个分区,专门用来存储而已。存储时其实是把DDR中的环境变量整体的写入SD卡中分区里。所以当我们saveenv时其实整个所有的环境变量都被保存了一遍,而不是只保存更改了的。
    (3)DDR中环境变量,在default_environment中,实质是字符数组。在uboot中其实是一个全局变量,链接时在数据段,重定位时default_environment就被重定位到DDR中一个内存地址处了。这个地址处这个全局字符数组就是我们uboot运行时的DDR中的环境变量了。

    总结:刚烧录的系统中环境变量分区是空白的,uboot第一次运行时加载的是uboot代码中自带的一份环境变量,叫默认环境变量。我们在saveenv时DDR中的环境变量会被更新到SD卡中的环境变量中,就可以被保存下来,下次开机会在环境变量relocate时会SD卡中的环境变量会被加载到DDR中去。

    default_environment中的内容虽然被uboot源代码初始化为一定的值(这个值就是我们的默认环境变量),但是在uboot启动的第二阶段,env_relocate时代码会去判断SD卡中的env分区的crc是否通过。如果crc校验通过说明SD卡中有正确的环境变量存储,则relocate函数会从SD卡中读取环境变量来覆盖default_environment字符数组,从而每次开机可以保持上一次更改过的环境变量。、

    do_printenv

    do_setenv

    int do_setenv (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
    {
        if (argc < 2) {
            printf ("Usage:
    %s
    ", cmdtp->usage);
            return 1;
        }
    
        return _do_setenv (flag, argc, argv);
    }
  • 相关阅读:
    git查日志命令
    使用git把本地目录传到远程仓库
    本地ssh设置多个git项目访问
    php的phar是什么?
    .ssh免密登录问题解决
    idea配置tomcat时,运行按钮灰色禁用状态
    idea快捷键main,print,代码提示
    windows安装hadoop找不到JAVA_HOME
    spring boot 启动时找不到主类
    jquery 删除自己
  • 原文地址:https://www.cnblogs.com/yr-linux/p/5496800.html
Copyright © 2020-2023  润新知