walnutcy

理解嵌入式linux的ENV

0
阅读(2839)

笔者用的是基于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 
#define CFG_ENV_OFFSET   0x4000 
#define CFG_ENV_ADDR   (CFG_DATAFLASH_LOGIC_ADDR_CS1 CFG_ENV_OFFSET) 
#define CFG_ENV_SIZE   0x4000   
 
#endif 

env分为CRC与数据区,在environment.h中定义,如下:

#ifdef CFG_REDUNDAND_ENVIRONMENT 
define ENV_HEADER_SIZE (sizeof(unsigned long1
#else 
define ENV_HEADER_SIZE (sizeof(unsigned long)) 
#endif 
 
#define ENV_SIZE (CFG_ENV_SIZE ENV_HEADER_SIZE) 
 
typedef struct environment_s 
 unsigned long crc;   
#ifdef CFG_REDUNDAND_ENVIRONMENT 
 unsigned char flags;   
#endif 
 unsigned char data[ENV_SIZE];  
env_t; 

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)        "\0" 
#endif 
#ifdef    CONFIG_ETH2ADDR 
    "eth2addr="    MK_STR(CONFIG_ETH2ADDR)        "\0" 
#endif 
#ifdef    CONFIG_ETH3ADDR 
    "eth3addr="    MK_STR(CONFIG_ETH3ADDR)        "\0" 
#endif 
#ifdef    CONFIG_IPADDR 
    "ipaddr="    MK_STR(CONFIG_IPADDR)        "\0" 
#endif 
#ifdef    CONFIG_SERVERIP 
    "serverip="    MK_STR(CONFIG_SERVERIP)        "\0" 
#endif 
#ifdef    CFG_AUTOLOAD 
    "CoLor: rgb(163,21,21)">"\0" 
#endif 
#ifdef    CONFIG_PREBOOT 
    "preboot="    CONFIG_PREBOOT            "\0" 
#endif 
#ifdef    CONFIG_ROOTPATH 
    "rootpath="    MK_STR(CONFIG_ROOTPATH)        "\0" 
#endif 
#ifdef    CONFIG_GATEWAYIP 
    "gatewayip="    MK_STR(CONFIG_GATEWAYIP)    "\0" 
#endif 
#ifdef    CONFIG_NETMASK 
    "netmask="    MK_STR(CONFIG_NETMASK)        "\0" 
#endif 
#ifdef    CONFIG_HOSTNAME 
    "hostname="    MK_STR(CONFIG_HOSTNAME)        "\0" 
#endif 
#ifdef    CONFIG_BOOTFILE 
    "bootfile="    MK_STR(CONFIG_BOOTFILE)        "\0" 
#endif 
#ifdef    CONFIG_LOADADDR 
    "loadaddr="    MK_STR(CONFIG_LOADADDR)        "\0" 
#endif 
#ifdef  CONFIG_CLOCKS_IN_MHZ 
    "clocks_in_mhz=1\0" 
#endif 
#if defined(CONFIG_PCI_BOOTDELAY) && (CONFIG_PCI_BOOTDELAY 0
    "pcidelay="    MK_STR(CONFIG_PCI_BOOTDELAY)    "\0" 
#endif 
#ifdef  CONFIG_EXTRA_ENV_SETTINGS 
    CONFIG_EXTRA_ENV_SETTINGS 
#endif 
    "\0" 
}; 

具体也可参照:env_common.c、env_dataflash.c、cmd_nvedit.c、fw_env.c等文件。

在升级与配置过程中,env常用的操作有:getenv、setenv、saveenv。