理解嵌入式linux的ENV
0赞
发表于 2012/9/14 11:24:36
阅读(2691)
笔者用的是基于AT91SAM9260的linux设备,从DataFlash启动,了解的兄弟应该知道,其启动分为4块,第一块dataflash BOOT,第2部分u-boot,第3部分OS,第4部分根目录应用。所以dataflash被划分为5块区域,分别为boot1,env,uboot,os,rootvfs。
笔者这里主要讨论env的实现及保存方式,笔者所用的系统默认为env分配16K内存,在include/configs/at91sam9260ek.h中定义,如下:
#ifdef
CFG_ENV_IS_IN_DATAFLASH
#defineCFG_ENV_OFFSET
0x4000
#defineCFG_ENV_ADDR
(CFG_DATAFLASH_LOGIC_ADDR_CS1
+
CFG_ENV_OFFSET)
#defineCFG_ENV_SIZE
0x4000
#endif
#define
#define
#define
#endif
env分为CRC与数据区,在environment.h中定义,如下:
#ifdef
CFG_REDUNDAND_ENVIRONMENT
#define
ENV_HEADER_SIZE
(
sizeof(
unsigned
long)
+
1)
#else
#define
ENV_HEADER_SIZE
(
sizeof(
unsigned
long))
#endif
#defineENV_SIZE
(CFG_ENV_SIZE
-
ENV_HEADER_SIZE)
typedef
struct
environment_s
{
unsigned
long
crc;
#ifdefCFG_REDUNDAND_ENVIRONMENT
unsigned
char
flags;
#endif
unsigned
char
data[ENV_SIZE];
}env_t;
#
#else
#
#endif
#define
typedef
#ifdef
#endif
}
env数据区中,参数按串保存,每个参数均为名称+=+内容+串结束符('\x0'),如下为参照:
uchar
default_environment[]
=
{
#ifdef
CONFIG_BOOTARGS
"bootargs="
CONFIG_BOOTARGS
"\0"
#endif
#ifdef
CONFIG_BOOTCOMMAND
"bootcmd="
CONFIG_BOOTCOMMAND
"\0"
#endif
#ifdef
CONFIG_RAMBOOTCOMMAND
"ramboot="
CONFIG_RAMBOOTCOMMAND
"\0"
#endif
#ifdef
CONFIG_NFSBOOTCOMMAND
"nfsboot="
CONFIG_NFSBOOTCOMMAND
"\0"
#endif
#if
defined(CONFIG_BOOTDELAY)
&&
(CONFIG_BOOTDELAY
>=
0)
"bootdelay="
MK_STR(CONFIG_BOOTDELAY)
"\0"
#endif
#if
defined(CONFIG_BAUDRATE)
&&
(CONFIG_BAUDRATE
>=
0)
"baudrate="
MK_STR(CONFIG_BAUDRATE)
"\0"
#endif
#ifdef
CONFIG_LOADS_ECHO
"loads_echo="
MK_STR(CONFIG_LOADS_ECHO)
"\0"
#endif
#ifdef
CONFIG_ETHADDR
"ethaddr="
MK_STR(CONFIG_ETHADDR)
"\0"
#endif
#ifdef
CONFIG_ETH1ADDR
"eth1addr="
MK_STR(CONFIG_ETH1ADDR)
#ifdef
#endif
#ifdef
#endif
#ifdef
#endif
#ifdef
#endif
#if
#endif
#if
#endif
#ifdef
#endif
#ifdef
#endif
#ifdef