笔记整理—uboot番外(3)环境变量的作用

news2024/9/25 15:26:36

        环境变量的最大一个作用就是,能够在不修改代码的情况下去影响应用的运行情况。

        环境变量的优先级问题:有环境变量的情况下优先使用环境变量,没有环境变量则使用代码中的值(全局变量一类的变量)。

        例如,machid在bdinfo中,而不再print_env中(环境变量)。但若是set machid 0x30001332就可以在环境变量中生成一个值,当校验时会对这个值进行采用。

        删除一个环境变量的方法:如刚刚设置了set machid 0x30001332,则使用set machid就能够删除掉这个环境变量,启动时依然使用bdinfo中的参数。(记住环境变量设置后save一下)

        默认的第一次加载uboot时,其env分区为空,在第一次运行时会去加载代码中的默认值(uboot/common/env_common.c中default_environment)。

        在default_environment中,每个环境变量以‘\0’进行分割。在第一次工作完成后,当save env时,DDR中的env会被更新到SD卡的环境变量分区中,在下次relocate时被加载到DDR中使用。

        链接时将default_environment放数据段的位置,重定位时放DDR的对应位置。

        SD卡中的环境变量会进行CRC校验查看是否可用以此验证值并进行更新。

printenv功能也就是print指令    //打印环境变量

        对于do_printenv()函数而言,argc=1时 打印的是所有的环境变量,当argc>=2时,则会打印相关的环境变量。

        环境变量在内存中的存储方式:以字符串方式进行存储,变量与变量之间以‘\0’为分隔。

        代码表现为:

if(1==argc){
    for(nex=i;env_get_char(nex)!='\0';++nex)
        {
         for(k=i;k<nxt;++k)
            {
              putc(env_get_char(k));
            }
         putc('\n');
        
         if(ctrlc())
            {
              puts("\nxxAbort\n");
              return 1;    
            }
        
           }
    printf("\nEnvironment size:%d/%ld bytes\n",i,(ulong)env_size)
        
}

 setenv功能也就是set指令是用于设置环境变量的对应do_setenv()函数。当argc<2时指令错误,argc>=2时为do_setenv(flag,argc,argv);

char* env_data=env_get_addr(0);//得到首元素首地址
name=argv[1];

for(env=env_data;*env!='\0';env=nex+1)
{
    for(nex=env;*nex!='\0';++nex)
        {
            if((oldval=envmatch(uchar*)name,env-env_data)>=0)
                break;
        }
}

        envmatch比较env-env_data=取名字,找到后通过break弹出,以env与nex记录位置。

        删除env与nex中间的内容,以‘\0’填充:1.遍历DDR相关区域是否存在当前变量。2.擦除当前找到区域内容。3.复写新内容到相关地址。

        一些重要的环境变量可能与全局变量冲突,也就是当gd与env冲突,出现这种情况应该去更新gd方面的内容。

        saveenv保存环境变量,对应do_saveenv()函数。相关内容在env_auto中。读取寄存器INF_REC(OMPin内对应的寄存器)得知启动介质,在其中使用saveenv()实现保存数据。对于x210而言,启动介质信息存放在0xE010F000+0c,放了#mmc_sd(3)(这个在start.S里),所以判断其介质为3-movinand,所以会调用movi_write_env()进行保存。

        virt_tophy对虚拟地址进行物理地址转换,通过raw_area_control进行改写(inand/sd卡的原始分区表)。

        getenv获取环境变量的值,getenv_r为其可重入版本。

         *get_env(char *name)与上面说到的双层for有相同的逻辑,依靠envmatch进行比对,遍历default_environment进行查找。

        getenv_r(char* name,char *buf,unsigned len):getenv()的方法是返回地址(不是很安全),而getenv_r()是复制一份内容到buf'中,不去动用DDR的变量(相对安全),_r的版本可进行环境变量处理。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2104823.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

随身WiFi实测,真相让你大跌眼镜!随身携带的随身wifi哪个比较好?什么品牌的随身wifi好用?

都说随身wifi坑多&#xff0c;谁买谁是冤大头&#xff01;我还真不信这个邪&#xff01;本次我们对格行、京东云、迅优三款热门随身WiFi进行了开箱测试&#xff0c;实测周期为2个月。今天从外观、网速、续航、售后、适合人群及整体评价等方面进行全面剖析。 一、京东云随身WiFi…

Qt 杨帆起航

这里写自定义目录标题 引入1、Qt安装1.1 OSX1.1.1 HomeBrew 方式安装1.1.2 自己编译 1.2 Windows x、IDEx.1 Clionx.1.1 ui 文件到Qt设计师x.1.2 ui文件更新&#xff0c;为及时调用uiCompile生成或更新cpp文件x.1.3 qt资源文件创建x.1.4 帮助文档的配置 引入 机缘巧合&#xf…

图像缩放操作

图像缩放操作 微信公众号&#xff1a;幼儿园的学霸 在图像处理过程中&#xff0c;有时需要把图像调整到同样大小&#xff0c;便于处理&#xff0c;这时需要用到图像resize()&#xff0c;该函数比较简单&#xff0c;此处对函数中涉及的各种插值方法进行分析。 目录 文章目录 图…

利用Python解析json生成PPT、xmind思维导图教程

文章目录 背景部分json样例PPT生成思维导图生成 背景 通过调用阿里通义听悟接口&#xff0c;对视频进行了语音转写、智能总结等&#xff0c;现在需要解析返回的PPT和思维导图json文件&#xff0c;以可视化的形式进行呈现。关键点在于&#xff1a; PPT生成时&#xff0c;注意用…

【电池专题】软包电池封装工序

铝塑膜成型工序冲坑 铝塑膜成型工序,软包电芯可以根据客户的需求设计成不同的尺寸,当外形尺寸设计好后,就需要开具相应的模具,使铝塑膜成型。 成型工序也叫作冲坑,顾名思义,就是用成型模具在加热的情况下,在铝塑膜上冲出一个能够装卷芯的坑,具体的见下图。 …

推荐4个一键生成 PPT的AI工具,让你畅享智能办公!

对于职场人士来说&#xff0c;ai PPT 工具已经成为了高效办公的一大得力助手 。它可以让你从繁琐的 PPT 制作中解脱出来&#xff0c;把更多的时间放在其他的工作准备上面。并且它们有极大的设计能力&#xff0c;会让我们的PPT变的设计感十足&#xff0c;如果大家正在为PPT制作烦…

【Linux】进程周边:进程概念

&#x1f337;相关专栏&#xff1a;《c学习》《Linux进阶之路》&#x1f337; 全片内容总览&#xff1a; 目录 1.进程基本概念 2.进程的本质&#xff1f;为什么要有进程控制块PCB&#xff1f; 1&#xff09;为什么要有进程控制块PCB&#xff1f; 2&#xff09;进程的本质 …

sqli-labs靶场通关攻略(41-60)

第四十一关 联合查询爆出数据库 但这关考察的时堆叠注入 &#xff0c;我们给他注入一条数据 输入id50即可查到我们注入的数据 第四十二关 看页面似曾相识&#xff0c;上次我们是用注册新用户然后对其他账户进行登录从而造成注入&#xff0c;但这次不能注册新用户了 存在堆叠注…

leetcode 1645 Hopper公司查询2(postgresql)

需求 表: Drivers -------------------- | Column Name | Type | -------------------- | driver_id | int | | join_date | date | -------------------- driver_id是该表的主键。 该表的每一行均包含驾驶员的ID以及他们加入Hopper公司的日期。 表: Rides ---------------…

【JAVA入门】Day27 - 单列集合体系结构综述

【JAVA入门】Day27 - 单列集合体系结构 文章目录 【JAVA入门】Day27 - 单列集合体系结构1.1 Collection 集合的基本方法1.2 Collection 集合的遍历方式1.2.1 迭代器遍历1.2.2 增强 for 遍历1.2.3 利用 Lambda 表达式进行遍历 1.3 List 集合的基本方法1.4 List 集合的遍历方式 J…

云手机怎样简化海外社媒平台运营

随着越来越多的卖家希望拓展海外市场&#xff0c;运营TikTok、Facebook等社交媒体平台已经成为吸引流量和促进销售的重要手段。然而&#xff0c;在管理海外社媒账号的过程中&#xff0c;许多人会面临网络连接的问题。这时&#xff0c;使用一款高效便捷的云手机工具就显得尤为便…

企业财税自动化解决方案案例分享与经验总结

数字经济时代&#xff0c;企业在财税管理方面面临着越来越多的挑战&#xff0c;作为企业运营的核心部分&#xff0c;其效率和准确性直接关系到企业的财务健康和决策效率。为全面提升财务管理工作的效率和质量&#xff0c;推动业财融合&#xff0c;许多企业开始探索&#xff0c;…

ML17_变分推断01:KL散度、ELBO

1. KL散度 KL散度&#xff08;Kullback-Leibler divergence&#xff09;&#xff0c;也称为相对熵&#xff08;relative entropy&#xff09;&#xff0c;是由Solomon Kullback和Richard Leibler在1951年引入的一种衡量两个概率分布之间差异的方法。KL散度不是一种距离度量&am…

Flutter的升级和降级步骤

升级 1.版本升级 // 升级到指定版本 flutter upgrade 版本号 // 升级到最新版本 flutter upgrade 2. 更新开发配置 启动 Android Studio。 打开 Settings 对话框&#xff0c;查看 SDK Manager。 如果你已经打开了一个项目&#xff0c;请打开 Tools > SDK Manager。 如果…

设置Virtualbox虚拟机共享文件夹

由于工作环境的原因&#xff0c;选择Virtualbox的方式安装虚拟操作系统&#xff0c;常用的操作系统为ubuntu&#xff0c;不知道道友是否也曾遇到这样的问题&#xff0c;就是虚拟机和主机进行文件拖拽的时候&#xff0c;会因为手抖造成拖拽失败&#xff0c;虚拟机界面显示大个的…

CCSI: 用于无数据类别增量学习的持续类别特定印象|文献速递--基于深度学习的医学影像病灶分割

Title 题目 CCSI: Continual Class-Specific Impression for data-free class incremental learning CCSI: 用于无数据类别增量学习的持续类别特定印象 01 文献速递介绍 当前用于医学图像分类任务的深度学习模型表现出了令人鼓舞的性能。然而&#xff0c;这些模型大多要求…

python 怎样计算字符串的长度

python 计算字符串长度&#xff0c;一个中文算两个字符&#xff0c;先转换成utf8&#xff0c;然后通过计算utf8的长度和len函数取得的长度&#xff0c;进行对比即可知道字符串内中文字符的数量&#xff0c;自然就可以计算出字符串的长度了。 valueu脚本12 length len(value) u…

电车买不了保险?就该车企负责

文 | AUTO芯球 作者 | 雷慢 买电车的真是太糟心了&#xff0c; 来看这个车主&#xff0c;去年保费4200&#xff0c;今年保险公司拒保了&#xff0c; 车主说要投诉&#xff0c;保险公司就扔过来一张1万5的报价单。 你不是要保险吗&#xff0c;买吧&#xff01; 我告诉你们&…

安装破解激活pycharm

装pycharm之前先装python 激活方式版本不能过新&#xff0c;要22年1月及其之前的版本&#xff0c;下拉找到对应版本的专业版 Other Versions - PyCharmGet past releases and previous versions of PyCharm.https://www.jetbrains.com/pycharm/download/other.html 2.下载电脑…

【支付】PayPal支付通道 Java对接 (下单 付款 确认 退款 查询 回调)

使用Java 对接 PayPal 接口&#xff0c;从下单&#xff0c;支付&#xff0c;确认订单、查询、退款、退款查询、回调处理等全流程代码示例&#xff0c;以及图文说明。 PayPal接口调用时序图 #mermaid-svg-WARCfGOa6JcsCAch {font-family:"trebuchet ms",verdana,aria…