u-boot环境变量
来源:互联网 发布:docker跑windows程序 编辑:程序博客网 时间:2024/04/28 23:58
在u-boot命令行中输入print会得到所以的环境变量,这些环境变量都是在哪里定义的呢??
先看看print命令在哪里实现
U_BOOT_CMD(printenv, CONFIG_SYS_MAXARGS, 1,do_env_print,"print environment variables","\n - print values of all environment variables\n""printenv name ...\n"" - print value of environment variable 'name'");
文件common/Cmd_nvedit.c 定义了printenv命令,我们来看看它是从哪里打印的
int do_env_print (cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]){int i;int rcode = 0;if (argc == 1) {/* print all env vars */rcode = env_print(NULL);if (!rcode)return 1;printf("\nEnvironment size: %d/%ld bytes\n",rcode, (ulong)ENV_SIZE);return 0;}/* print selected env vars */for (i = 1; i < argc; ++i) {int rc = env_print(argv[i]);if (!rc) {printf("## Error: \"%s\" not defined\n", argv[i]);++rcode;}}return rcode;}
env_print中
char *res = NULL;size_t len;/* print whole list */len = hexport('\n', &res, 0);if (len > 0) {puts(res);free(res);return len;}
再看hexport
ssize_t hexport(const char sep, char **resp, size_t size){return hexport_r(&htab, sep, resp, size);}
最终在函数hexport_r中找到这么一段
for (i = 1, n = 0, totlen = 0; i <= htab->size; ++i) {if (htab->table[i].used) {ENTRY *ep = &htab->table[i].entry;list[n++] = ep;totlen += strlen(ep->key) + 2;if (sep == '\0') {totlen += strlen(ep->data);} else {/* check if escapes are needed */char *s = ep->data;while (*s) {++totlen;/* add room for needed escape chars */if ((*s == sep) || (*s == '\\'))++totlen;++s;}}totlen += 2;/* for '=' and 'sep' char */}}
将结构体htab中的table结构体中的entry项的地址给ep
然后把ep的地址给数组list,在下文打印出list数组
for (i = 0, p = res; i < n; ++i) {char *s;s = list[i]->key;while (*s)*p++ = *s++;*p++ = '=';s = list[i]->data;while (*s) {if ((*s == sep) || (*s == '\\'))*p++ = '\\';/* escape */*p++ = *s++;}*p++ = sep;}
我们来搜索一下看看谁定义并填充了htab结构体
在同一个文件中找到htab的定义
static struct hsearch_data htab;
那么猜测填充这个htab的函数也在这个文件中
果然在同文件中找到函数hcreate
int hcreate(size_t nel){return hcreate_r(nel, &htab);}
int hcreate_r(size_t nel, struct hsearch_data *htab){/* Test for correct arguments. */if (htab == NULL) {__set_errno(EINVAL);return 0;}/* There is still another table active. Return with error. */if (htab->table != NULL)return 0;/* Change nel to the first prime number not smaller as nel. */nel |= 1;/* make odd */while (!isprime(nel))nel += 2;htab->size = nel;htab->filled = 0;/* allocate memory and zero out */htab->table = (_ENTRY *) calloc(htab->size + 1, sizeof(_ENTRY));if (htab->table == NULL)return 0;/* everything went alright */return 1;}
搜索一下看看谁调用hcreate
竟然没有人调用hcreate??这什么情况?不按套路出牌啊!
记得board_init_r函数中调用了一个环境变量初始化函数
/* initialize environment */env_relocate();
env_relocate中有
</pre><pre name="code" class="cpp">env_relocate_spec ();
结果弄了一堆env_relocate_spec ()不知道u-boot用的哪个,郁闷
最后根据编译u-boot时候的输出信息,common目录下包含了env_auto.o知道env_relocate_spec ()是在env_auto.c中定义
env_relocate_spec ()中
use_default();找到use_default()
static void use_default(){char boot_cmd[100];puts("*** Warning - using default environment\n\n");if (default_environment_size > CONFIG_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,default_environment_size);env_ptr->crc = crc32(0, env_ptr->data, ENV_SIZE);gd->env_valid = 1;env_import((const char *)env_ptr, 1);}在这里用的缺省环境变量设置
我们来看看default_environment
uchar default_environment[] = {#ifdefCONFIG_BOOTARGS"bootargs="CONFIG_BOOTARGS"\0"#endif#ifdefCONFIG_BOOTCOMMAND"bootcmd="CONFIG_BOOTCOMMAND"\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#ifdefCONFIG_ETHADDR"ethaddr="MK_STR(CONFIG_ETHADDR)"\0"#endif#ifdefCONFIG_IPADDR"ipaddr="MK_STR(CONFIG_IPADDR)"\0"#endif#ifdefCONFIG_SERVERIP"serverip="MK_STR(CONFIG_SERVERIP)"\0"#endif#ifdefCONFIG_GATEWAYIP"gatewayip="MK_STR(CONFIG_GATEWAYIP)"\0"#endif#ifdefCONFIG_NETMASK"netmask="MK_STR(CONFIG_NETMASK)"\0"#endif"\0"};
再看看配置文件
#define CONFIG_ETHADDR00:40:5c:26:0a:5b#define CONFIG_NETMASK 255.255.255.0#define CONFIG_IPADDR192.168.0.20#define CONFIG_SERVERIP192.168.0.10#define CONFIG_GATEWAYIP192.168.0.1#define CONFIG_BOOTDELAY3/* Default boot commands for Android booting. */#define CONFIG_BOOTCOMMAND"movi read kernel 0 40008000;movi read rootfs 0 41000000 100000;bootm 40008000 41000000"#define CONFIG_BOOTARGS""
默认的环境变量为
bootargs= bootcmd= movi read kernel 0 40008000;movi read rootfs 0 41000000 100000;bootm 40008000 41000000bootdelay=3baudrate=115200ethaddr=00:40:5c:26:0a:5bipaddr= 192.168.0.20serverip=192.168.0.10gatewayip=192.168.0.1netmask=255.255.255.0
0 0
- U-BOOT环境变量实现
- U-BOOT环境变量实现
- U-BOOT环境变量实现
- U-BOOT环境变量实现
- U-BOOT环境变量实现
- U-BOOT环境变量实现
- U-Boot的环境变量
- U-Boot环境变量
- U-BOOT环境变量实现
- u-boot环境变量解释
- U-BOOT环境变量实现
- u-boot环境变量
- u-boot环境变量
- u-boot环境变量设置
- U-BOOT环境变量实现
- u-boot的环境变量
- U-BOOT环境变量实现
- U-BOOT环境变量实现
- 总结系列_13(Qt使用总结,续...)
- JavaScript 中 私有/公有属性 私有/公有方法 类/实例方法 的区别
- Open Source Compiles in an Xcode 5.1 World
- Hdu1407 - 测试你是否和LTC水平一样高 - 水题
- NMON工具安装使用
- u-boot环境变量
- OC-属性与成员变量的简单介绍与区别
- tip5:了解C++默默编写并调用了哪些函数
- 【动态规划-01背包】 HDU 1203 I NEED A OFFER!
- 云计算仿真工具中文注释CloudSim.java
- JTree总结
- Acitivity 之间如何传递消息(数据)
- Codeforces #260 (Div. 1) B. A Lot of Games(数据结构:trie+DFS)
- 树递归查询节点下所有子孙