理解嵌入式linux的ENV
0赞
发表于 9/14/2012 11:24:36 AM
阅读(2904)
笔者用的是基于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)
typedefstruct 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
#ifdefined(CONFIG_BOOTDELAY) && (CONFIG_BOOTDELAY >= 0)
"bootdelay=" MK_STR(CONFIG_BOOTDELAY) "\0"
#endif
#ifdefined(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