參考部分:http://www.cnblogs.com/biaohc/p/6398515.html
環境變量的作用:
首先我們先要搞清楚uboot中環境變量的作用,uboot中環境變量的作用就是在不改變源碼、不用重新編譯的情況下,可以使我們通過
設定環境變量的值來改變uboot的一些設定,如bootdelay時間、機器碼的值等等。
env_ptr代表flash的位址。其中CFG_ENV_ADDR為0x70000,對應于norflash的第10個塊位址(flash信号為AM29LV800BB),環境變量獨占居一個資料塊,是以說可以進行單獨儲存。
env_t *env_ptr = (env_t *)CFG_ENV_ADDR;
typedef struct environment_s {
unsigned long crc; /* CRC32 over data bytes */
#ifdef CFG_REDUNDAND_ENVIRONMENT
unsigned char flags; /* active/obsolete flags */
#endif
unsigned char data[ENV_SIZE]; /* Environment data */
} env_t;
環境變量的結構env_t,CRC是對資料的校驗值,flag,表明環境變量是否有效,crc準備。
關于環境變量的函數分析
一、int env_init(void);環境變量的初始化
int env_init(void)
{
#ifdef CONFIG_OMAP2420H4
int flash_probe(void);
if(flash_probe() == 0)
goto bad_flash;
#endif
if (crc32(0, env_ptr->data, ENV_SIZE) == env_ptr->crc) {
gd->env_addr = (ulong)&(env_ptr->data);
gd->env_valid = 1;
return(0);
}
#ifdef CONFIG_OMAP2420H4
bad_flash:
#endif
gd->env_addr = (ulong)&default_environment[0];
gd->env_valid = 0;
return (0);
}
函數中對預設的env_t位址進行校驗,flash中是否有資料存在,如果有直接将全局變量中gd中的env_addr指向flash的env_t空間,并将gd的有效标志位置1.如果flash中不存在環境變量的值,将gd的環境指針指向程式中預設值,有效值為0.
二、void env_relocate (void)
void env_relocate (void)
{
DEBUGF ("%s[%d] offset = 0x%lx\n", __FUNCTION__,__LINE__,
gd->reloc_off);
#ifdef CONFIG_AMIGAONEG3SE
enable_nvram();
#endif
#ifdef ENV_IS_EMBEDDED
/*
* The environment buffer is embedded with the text segment,
* just relocate the environment pointer
*/
env_ptr = (env_t *)((ulong)env_ptr + gd->reloc_off);
DEBUGF ("%s[%d] embedded ENV at %p\n", __FUNCTION__,__LINE__,env_ptr);
#else
/*
* We must allocate a buffer for the environment
*/
env_ptr = (env_t *)malloc (CFG_ENV_SIZE);
DEBUGF ("%s[%d] malloced ENV at %p\n", __FUNCTION__,__LINE__,env_ptr);
#endif
/*
* After relocation to RAM, we can always use the "memory" functions
*/
env_get_char = env_get_char_memory;
if (gd->env_valid == 0) {
#if defined(CONFIG_GTH) || defined(CFG_ENV_IS_NOWHERE) /* Environment not changable */
puts ("Using default environment\n\n");
#else
puts ("*** Warning - bad CRC, using default environment\n\n");
SHOW_BOOT_PROGRESS (-1);
#endif
if (sizeof(default_environment) > ENV_SIZE)
{
puts ("*** Error - default environment is too large\n\n");
return;
}
memset (env_ptr, 0, sizeof(env_t));
memcpy (env_ptr->data,
default_environment,
sizeof(default_environment));
#ifdef CFG_REDUNDAND_ENVIRONMENT
env_ptr->flags = 0xFF;
#endif
env_crc_update ();
gd->env_valid = 1;
}
else {
env_relocate_spec ();
}
gd->env_addr = (ulong)&(env_ptr->data);
#ifdef CONFIG_AMIGAONEG3SE
disable_nvram();
#endif
}
分析:沒有定義ENV_IS_EMBEDED,環境變量的位址為0x70000,前面有448KB。在記憶體中配置設定一個環境變量的空間。将環境變量拷貝到記憶體中。
環境變量相關的函數:int saveenv(void);void setenv (char *, char *);都會調用環境變量