通过搜素比对字符串保存env。

所有的env都保存在一起,每个环境变量字段都以“\0\0”结束,最后一个命令字段以“\0\0\0”结束。

每次uboot启动时,先读出环境变量。当设置新数据时,遍历整个env,确认是否有重复的,

有重复的删除掉,并把新数据设置到环境变量最后。

只有当运行saveenv时才把数据保存到硬件存储设备中。

-----------------------------------------------------------------------------------------------------------

定义于include/environment.h

102 typedef struct environment_s {
103     uint32_t    crc;        /* CRC32 over data bytes    */
104 #ifdef CFG_REDUNDAND_ENVIRONMENT
105     unsigned char   flags;      /* active/obsolete flags    */
106 #endif
107     unsigned char   data[ENV_SIZE]; /* Environment data     */
108 } env_t;

common/env_common.c中存储默认环境变量:

54 /************************************************************************
 55  * Default settings to be used when no valid environment is found
 56  */
 57 #define XMK_STR(x)  #x
 58 #define MK_STR(x)   XMK_STR(x)
 59
 60 uchar default_environment[] = {
 61 #ifdef  CONFIG_BOOTARGS
 62     "bootargs=" CONFIG_BOOTARGS         "\0"
 63 #endif
 64 #ifdef  CONFIG_BOOTCOMMAND
 65     "bootcmd="  CONFIG_BOOTCOMMAND      "\0"
 66 #endif
 67 #ifdef  CONFIG_RAMBOOTCOMMAND
 68     "ramboot="  CONFIG_RAMBOOTCOMMAND       "\0"
 69 #endif
 70 #ifdef  CONFIG_NFSBOOTCOMMAND
 71     "nfsboot="  CONFIG_NFSBOOTCOMMAND       "\0"
 72 #endif
 73 #if defined(CONFIG_BOOTDELAY) && (CONFIG_BOOTDELAY >= 0)
 74     "bootdelay="    MK_STR(CONFIG_BOOTDELAY)    "\0"
 75 #endif
 76 #if defined(CONFIG_BAUDRATE) && (CONFIG_BAUDRATE >= 0)
 77     "baudrate=" MK_STR(CONFIG_BAUDRATE)     "\0"
 78 #endif
 79 #ifdef  CONFIG_LOADS_ECHO
 80     "loads_echo="   MK_STR(CONFIG_LOADS_ECHO)   "\0"
 81 #endif
 82 #ifdef  CONFIG_ETHADDR
 83     "ethaddr="  MK_STR(CONFIG_ETHADDR)      "\0"
 84 #endif
 85 #ifdef  CONFIG_ETH1ADDR
86     "eth1addr=" MK_STR(CONFIG_ETH1ADDR)     "\0"
 87 #endif
 88 #ifdef  CONFIG_ETH2ADDR
 89     "eth2addr=" MK_STR(CONFIG_ETH2ADDR)     "\0"
 90 #endif
 91 #ifdef  CONFIG_ETH3ADDR
 92     "eth3addr=" MK_STR(CONFIG_ETH3ADDR)     "\0"
 93 #endif
 94 #ifdef  CONFIG_IPADDR
 95     "ipaddr="   MK_STR(CONFIG_IPADDR)       "\0"
 96 #endif
 97 #ifdef  CONFIG_SERVERIP
 98     "serverip=" MK_STR(CONFIG_SERVERIP)     "\0"
 99 #endif
100 #ifdef  CFG_AUTOLOAD
101     "autoload=" CFG_AUTOLOAD            "\0"
102 #endif
103 #ifdef  CONFIG_PREBOOT
104     "preboot="  CONFIG_PREBOOT          "\0"
105 #endif
106 #ifdef  CONFIG_ROOTPATH
107     "rootpath=" MK_STR(CONFIG_ROOTPATH)     "\0"
108 #endif
109 #ifdef  CONFIG_GATEWAYIP
110     "gatewayip="    MK_STR(CONFIG_GATEWAYIP)    "\0"
111 #endif
112 #ifdef  CONFIG_NETMASK
113     "netmask="  MK_STR(CONFIG_NETMASK)      "\0"
114 #endif
115 #ifdef  CONFIG_HOSTNAME
116     "hostname=" MK_STR(CONFIG_HOSTNAME)     "\0"
117 #endif
118 #ifdef  CONFIG_BOOTFILE
119     "bootfile=" MK_STR(CONFIG_BOOTFILE)     "\0"
120 #endif
121 #ifdef  CONFIG_LOADADDR
122     "loadaddr=" MK_STR(CONFIG_LOADADDR)     "\0"
123 #endif
124 #ifdef  CONFIG_CLOCKS_IN_MHZ
125     "clocks_in_mhz=1\0"
126 #endif
127 #if defined(CONFIG_PCI_BOOTDELAY) && (CONFIG_PCI_BOOTDELAY > 0)
128     "pcidelay=" MK_STR(CONFIG_PCI_BOOTDELAY)    "\0"
129 #endif
130 #ifdef  CONFIG_EXTRA_ENV_SETTINGS
131     CONFIG_EXTRA_ENV_SETTINGS
132 #endif
133     "\0"
134 };
宏定义位于配置文件中,include/configs/at91sam9g10ek

153 #define CFG_USE_NORFLASH        1
154 #define PHYS_FLASH_1            0x10000000
155 #define PHYS_FLASH_SIZE         0x800000    /* 8 MB main flash */
156 #define CFG_FLASH_BASE          PHYS_FLASH_1

225 #if CFG_USE_NORFLASH             
226 /* u-boot + env + linux in norflash */
227 #define CFG_ENV_IS_IN_FLASH 1
228 #define CFG_ENV_OFFSET      0x38000
229 #define CFG_ENV_ADDR        (PHYS_FLASH_1 + CFG_ENV_OFFSET)
230 #define CFG_ENV_OFFSET_REDUND   0x40000
231 #define CFG_ENV_SIZE        0x8000
232 #define CONFIG_BOOTCOMMAND  "cp.b 0x10100000 0x20008000 0x200000; bootm 0x20008000"
233 #if 0
234 #define CONFIG_BOOTARGS     "console=ttyS0,115200 "         \
235                     "root=/dev/mtdblock0 "          \
236                 "rootfstype=jffs2 "         \
237                 "init=linuxrc "             \
238                 "mem=64M "              \
239                 "ip=192.168.0.100:::::eth1:off "        \
240                 "ip=192.168.0.110:::::eth0:off"
241 #else
242 #define CONFIG_BOOTARGS     "console=ttyS0,115200 root=/dev/mtdblock0 rootfstype=jffs2 init=linuxrc mem=64M ip=192.168.0.100:::::eth1:off ip=192.168.0.110:::::eth0:off panic=10"
243 #endif
276 #define CFG_MALLOC_LEN      ROUND(3 * CFG_ENV_SIZE + 128*1024, 0x1000)
277 #define CFG_GBL_DATA_SIZE   128 /* 128 bytes for initial data */
278
279 #define CONFIG_STACKSIZE    (32*1024)   /* regular stack */
280 #define CONFIG_STACKSIZE_IRQ    (32*1024)   /* regular stack */
281 #define CONFIG_STACKSIZE_FIQ    (32*1024)   /* regular stack */

------------------------------------------------------------------------------------------------------------------------

env命令--common/cmd_nvedit.c

common/env_common.c供uboot调用的通用函数接口,隐藏了env的不同实现方式。

common/env_flash.c,env存储在flash的实现。

env_init()完成环境变量初始化工作,不同存储介质不同。
初始化流程
start.s           _start

lib_arm/board.c      start_armboot()  ----env_init()

                      ----env_relocate()

common/main.c      main_loop()

common/env_flash.c

68 #else /* ! ENV_IS_EMBEDDED */
 69
 70 env_t *env_ptr = (env_t *)CFG_ENV_ADDR;
 71 #ifdef CMD_SAVEENV
 72 static env_t *flash_addr = (env_t *)CFG_ENV_ADDR;
 73 #endif
 74
 75 #endif /* ENV_IS_EMBEDDED */

250 int  env_init(void)
251 {
252     if (crc32(0, env_ptr->data, ENV_SIZE) == env_ptr->crc) {
253         gd->env_addr  = (ulong)&(env_ptr->data);
254         gd->env_valid = 1;
255         return(0);
256     }
257
258     gd->env_addr  = (ulong)&default_environment[0];
259     gd->env_valid = 0;
260     return (0);
261 }

common/env_common.c

224 void env_relocate (void)
225 {
226     DEBUGF ("%s[%d] offset = 0x%lx\n", __FUNCTION__,__LINE__,
227         gd->reloc_off);
228
229 #ifdef CONFIG_AMIGAONEG3SE
230     enable_nvram();
231 #endif
232
233 #ifdef ENV_IS_EMBEDDED
234     /*
235      * The environment buffer is embedded with the text segment,
236      * just relocate the environment pointer
237      */
238     env_ptr = (env_t *)((ulong)env_ptr + gd->reloc_off);
239     DEBUGF ("%s[%d] embedded ENV at %p\n", __FUNCTION__,__LINE__,env_ptr);
240 #else
241     /*
242      * We must allocate a buffer for the environment
243      */
244     env_ptr = (env_t *)malloc (CFG_ENV_SIZE);
245     DEBUGF ("%s[%d] malloced ENV at %p\n", __FUNCTION__,__LINE__,env_ptr);
246 #endif
247
248     if (gd->env_valid == 0) {
249 #if defined(CONFIG_GTH) || defined(CFG_ENV_IS_NOWHERE)  /* Environment not changable */
250         puts ("Using default environment\n\n");
251 #else
252         puts ("*** Warning - bad CRC, using default environment\n\n");
253         show_boot_progress (-60);
254 #endif
255         set_default_env();
256     }
257     else {
258         env_relocate_spec ();
259     }
260     gd->env_addr = (ulong)&(env_ptr->data);
261
262 #ifdef CONFIG_AMIGAONEG3SE
263     disable_nvram();
264 #endif
265 }
注:ENV_IS_EMBEDDED没有定义,其含义为:
The environment buffer is embedded with the text segment, just relocate the environment pointer

uboot中env实现的更多相关文章

  1. uboot中变量env(收集)

    Env在u-boot中通常有两种存在方式,在永久性存储介质中(flash.NVRAM等),在SDRAM中.可配置不适用env的永久存储方式,但不常用.U-boot在启动时会将存储在永久性存储介质中的e ...

  2. u-boot中分区和内核MTD分区关系

    一.u-boot中环境变量与uImage中MTD的分区关系 分区只是内核的概念,就是说A-B地址放内核,C-D地址放文件系统,(也就是规定哪个地址区间放内核或者文件系统)等等. 一般我们只需要分3-4 ...

  3. u-boot中环境变量的实现

    转载:http://blog.chinaunix.net/uid-28236237-id-3867041.html U-boot中通过环境参数保存一些配置,这些配置可以通过修改环境参数.保存环境参数. ...

  4. u-boot中添加mtdparts支持以及Linux的分区设置

    简介 作者:彭东林 邮箱:pengdonglin137@163.com u-boot版本:u-boot-2015.04 Linux版本:Linux-3.14 硬件平台:tq2440, 内存:64M   ...

  5. uboot中setenv和saveenv分析

    转:https://blog.csdn.net/weixin_34355715/article/details/85751477 Env在u-boot中通常有两种存在方式,在永久性存储介质中(flas ...

  6. 在linux系统中通过fw_printenv查看和设置u-boot中的环境变量

    uboot下可以通过命令访问(printenv)和修改环境变量(setenv),但是如果需要在Linux系统下访问这些数据该怎么办呢?其实uboot早就帮我们想好了.  1.编译fw_printenv ...

  7. uboot中添加FIQ中断及相关问题

    本文主要说明了在uboot中添加FIQ中断时遇到的问题以及对应的解决办法. 首先交代一下项目的软硬件环境.硬件方面,使用s3c2440作为主控芯片,外接串口.网卡等设备.软件方面,主控芯片上电后运行u ...

  8. u-boot中nandflash初始化流程分析(转)

    u-boot中nandflash初始化流程分析(转) 原文地址http://zhuairlunjj.blog.163.com/blog/static/80050945201092011249136/ ...

  9. (四)ubuntu学习前传—uboot中对Flash和DDR的管理

    1.uboot阶段Flash的分区 (1)所谓分区,就是说对Flash进行分块管理.(2)PC机等产品中,因为大家都是在操作系统下使用硬盘的,整个硬盘由操作系统统一管理,操作系统会使用文件系统帮我们管 ...

随机推荐

  1. leetcode679:24Game

    题目链接 考虑1,5,5,5这种情况,有:5*(5-1/5)=24所以除法必须自定义运算才行. class Num: def __init__(self,up,down=1): self.up=up ...

  2. 马老师 LNMP生产环境Web架构 笔记

    http协议和缓存原理.多路IO模型: MIME机制,Multipurpose Internet Mail Extensions,多用户互联网邮件扩展.MIME使用一个简单的字符串组成,最初是为了标识 ...

  3. UltraEdit打开中文乱码

    http://hellofs.blog.51cto.com/6109153/1187548 UltraEdit很强大,但是今天发现在打开含有中文的文本时会乱码,还是在配置里找找相关的设置,可以在如图的 ...

  4. 最简单的回射客户/服务器程序、time_wait 状态

    下面通过最简单的客户端/服务器程序的实例来学习socket API. echoser.c 程序的功能是从客户端读取字符然后直接回射回去.  C++ Code  1 2 3 4 5 6 7 8 9 10 ...

  5. 进程枚举之PSAPI函数

    使用PSAPI (Process StatusAPI)函数 这是一种Windows NT/2000下的方法.核心是使用EnumProcesses函数.它的原型如下: BOOL EnumProcesse ...

  6. redis 基本概览

    1 redis 支持5种数据类型.redis 的值是字节数组,所以他不关心具体存储的是什么. redis 的键可以是 数值 strings lists sets hashes Redis 支持诸如列表 ...

  7. 高效使用 JavaScript 闭包,避免 Node.js 应用程序中的内存泄漏

    在 Node.js 中,广泛采用不同形式的闭包来支持 Node 的异步和事件驱动编程模型.通过很好地理解闭包,您可以确保所开发应用程序的功能正确性.稳定性和可伸缩性. 闭包是一种将数据与处理数据的代码 ...

  8. Spring Cloud构建微服务架构(三)断路器

    在分布式架构中,断路器模式的作用也是类似的,当某个服务单元发生故障(类似用电器发生短路)之后,通过断路器的故障监控(类似熔断保险丝),向调用方返回一个错误响应,而不是长时间的等待.这样就不会使得线程因 ...

  9. NAS、SAN和DAS的区别

    目前磁盘存储市场上,存储分类(如下表一)根据服务器类型分为:封闭系统的存储和开放系统的存储,封闭系统主要指大型机,AS400等服务器,开放系统指基于包括Windows.UNIX.Linux等操作系统的 ...

  10. 【Android】20.4 录音

    分类:C#.Android.VS2015: 创建日期:2016-03-13 一.简介 利用Android提供的MediaRecorder类可直接录制音频. 1.权限要求 录制音频和视频需要下面的权限: ...