uboot中env实现
通过搜素比对字符串保存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实现的更多相关文章
- uboot中变量env(收集)
Env在u-boot中通常有两种存在方式,在永久性存储介质中(flash.NVRAM等),在SDRAM中.可配置不适用env的永久存储方式,但不常用.U-boot在启动时会将存储在永久性存储介质中的e ...
- u-boot中分区和内核MTD分区关系
一.u-boot中环境变量与uImage中MTD的分区关系 分区只是内核的概念,就是说A-B地址放内核,C-D地址放文件系统,(也就是规定哪个地址区间放内核或者文件系统)等等. 一般我们只需要分3-4 ...
- u-boot中环境变量的实现
转载:http://blog.chinaunix.net/uid-28236237-id-3867041.html U-boot中通过环境参数保存一些配置,这些配置可以通过修改环境参数.保存环境参数. ...
- u-boot中添加mtdparts支持以及Linux的分区设置
简介 作者:彭东林 邮箱:pengdonglin137@163.com u-boot版本:u-boot-2015.04 Linux版本:Linux-3.14 硬件平台:tq2440, 内存:64M ...
- uboot中setenv和saveenv分析
转:https://blog.csdn.net/weixin_34355715/article/details/85751477 Env在u-boot中通常有两种存在方式,在永久性存储介质中(flas ...
- 在linux系统中通过fw_printenv查看和设置u-boot中的环境变量
uboot下可以通过命令访问(printenv)和修改环境变量(setenv),但是如果需要在Linux系统下访问这些数据该怎么办呢?其实uboot早就帮我们想好了. 1.编译fw_printenv ...
- uboot中添加FIQ中断及相关问题
本文主要说明了在uboot中添加FIQ中断时遇到的问题以及对应的解决办法. 首先交代一下项目的软硬件环境.硬件方面,使用s3c2440作为主控芯片,外接串口.网卡等设备.软件方面,主控芯片上电后运行u ...
- u-boot中nandflash初始化流程分析(转)
u-boot中nandflash初始化流程分析(转) 原文地址http://zhuairlunjj.blog.163.com/blog/static/80050945201092011249136/ ...
- (四)ubuntu学习前传—uboot中对Flash和DDR的管理
1.uboot阶段Flash的分区 (1)所谓分区,就是说对Flash进行分块管理.(2)PC机等产品中,因为大家都是在操作系统下使用硬盘的,整个硬盘由操作系统统一管理,操作系统会使用文件系统帮我们管 ...
随机推荐
- java.lang.UnsupportedClassVersionError: org/hibernate/SessionFactory : Unsupported major.minor version 52.0
问题: 在学习hibernate的过程中,涉及导入jar包的问题,写该文的时候是从官网下载的最新的hibernate的jar包hibernate-release-5.2.10.Final .在测试时, ...
- iOS - BSDSocket 的使用
1.BSDSocket 一套 unix 系统下的 socket API(纯 C). iOS 系统基于 unix,所以支持底层的 BSD Socket,在 Xcode 中可以直接使用. 2.基本使用 2 ...
- 转 python 读取中文文件名/中文路径
python直接读取中文路径的文件时失败,可做如下处理: inpath = 'D:/work/yuanxx/在线导航/驾车导航/walk_log/20130619_172355.txt' uipath ...
- TCP/IP协议栈与数据报封装
一.ISO/OSI参考模型 OSI(open system interconnection)开放系统互联模型是由ISO(International Organization for Standardi ...
- Factory - 工厂模式
在面向对象编程中, 最通常的方法是一个new操作符产生一个对象实例,new操作符就是用来构造对象实例的.但是在一些情况下, new操作符直接生成对象会带来一些问题.举例来说, 许多类型对象的创造需要一 ...
- js数组设置值操作
js中给数组中添加新值的方式: var flow=[]; for(var i=0;i<21;i++){ flow.push(Math.floor(Math.random()*(30+((i%12 ...
- 分享一:关于mysql中避免重复插入记录方法
一: INSERT ON DUPLICATE KEY UPDATE 如果您指定了ON DUPLICATE KEY UPDATE,并且插入行后会导致在一个UNIQUE索引或PRIMARY KEY中出现重 ...
- 几种常见排序算法之Java实现(插入排序、希尔排序、冒泡排序、快速排序、选择排序、归并排序)
排序(Sorting) 是计算机程序设计中的一种重要操作,它的功能是将一个数据元素(或记录)的任意序列,重新排列成一个关键字有序的序列. 稳定度(稳定性)一个排序算法是稳定的,就是当有两个相等记录的关 ...
- Unity刚体穿透问题测试以及解决
测试环境很简单,一面墙,红色方块不停向前 然后,由于刚体是FixedUpdate执行的,把FixedUpdate执行间隔调慢一些方便Debug: OK,下面还原一次经典的穿透问题: 测试脚本: voi ...
- no link present
今天装linux 系统.然后:service network restart的时候提演示样例如以下的错误: .............................................. ...