一、疑问

环境变量也是全局变量,为何不能像其他的全局变量放在data段呢?为什么要放在堆中或者使用ENV_IS_EMBEDDED定义的CFG_ENV_SIZE的空间大小,又为什么需要这么大的空间呢?

二、认识

1、尝试放在data段

由于环境变量区不像其他的全局变量,环境变量可以被删除,可以被更改,可以添加,这就要求存储环境变量的空间是足够大的。

也许可以用结构体数组来实现,分别存放环境变量的名字,及相应的值。这样就可以将环境变量放在data段,我们希望在经过start.s重定位后,环境变量已经处于指定的位置了。

struct environment{
struct environment * ptrfoward;
struct environment * ptrbackward;
char name[]
char value[]
};
struct environment tab[];

 problem

这种情况,环境变量区在flash上是编译器分配的空间。但是,受限于保存环境变量时,flash写是以块为单位的,如果把环境变量保存到之前编译器产生的地址上极有可能破坏其他的数据。也就是说放在data区很难实现。

如果想实现“在经过start.s重定位后,环境变量已经处于指定的位置了”这个目标,使用u-boot提供的ENV_IS_EMBEDED方法最好不过了,似乎也是唯一的办法了。

2、推理

保存环境变量要写flash=>> 环境变量在flash上,必须以整块存储 =>>在RAM中就必须有对应大小的空间  = >>可以在堆区分配,要不然就在编译器编译的时候分配(ENV_IS_EMBEDED的方法)

三、结论

1、环境变量由于大小不确定,必须给其分配足够大的空间,在内存中可以在堆区分配(但需要搬运两次,一次start.s重定位,一次环境变量重定位)。

2、由于还需要将其保存(存储)在flash上,所以要给其单独分一个分区。

3、利用2的特点可以使用ENV_IS_EMBEDED方法(只需要start.s重定位一次)。

四、其他

uboot的环境变量区是以字符串保存的,即使数字也是这样。字符串是接近人的高级表达形式,而非低级的机器二进制码。所以,在处理环境变量时(读、设置、保存),都是字符处理的。

uboot环境变量区为何不能放在data段的更多相关文章

  1. Linux系统——访问U-BOOT环境变量

    Linux系统下访问U-BOOT环境变量 移植过U-BOOT的人,都知道:在U-BOOT中存有ENV.但U-BOOT在引导内核启动之后,U-BOOT的生命周期就结束了.那么启动LINUX内核之后,U- ...

  2. uboot环境变量实现分析

    u-boot的环境变量用来存储一些经常使用的参数变量,uboot希望将环境变量存储在静态存储器中(如nand nor eeprom mmc). 其中有一些也是大家经常使用,有一些是使用人员自己定义的, ...

  3. 在Linux里读取UBOOT环境变量

    转载:http://falloutmx.blog.163.com/blog/static/39236020201211145010154/ 可以通过mtd方式读取,也可以用ioremap方式.不过这些 ...

  4. uboot环境变量初始化

    一.环境变量概述 1.环境变量的概念 可以理解为用户对软件的全局配置信息,这部分信息应该可以从永久性存储器上读取,能被查询,能被修改. 启动过程中,应该首先把环境变量读取到合适的内存区域,然后利用环境 ...

  5. OK335xS U-boot 环境变量解析

    /************************************************************************************************** ...

  6. MPC8313ERDB在Linux从NAND FLASH读取UBoot环境变量的代码分析

    MPC8313ERDB在Linux从NAND FLASH读取UBoot环境变量的代码分析 Yao.GUET@2014-05-19 一.故事起因 由于文件系统的增大,已经大大的超出了8MB的NOR FL ...

  7. u-boot 环境变量参数设置

    今天本来是烧写内核,结果一不小心把uboot也整不能用了,无奈之下只好重新烧个uboot,等都弄好以后,发现系统还是启动不了,原来是启动参数设置不对,于是找到了这篇文章,//是我添加的内容. 原文地址 ...

  8. I.MX6 Linux U-boot 环境变量解析

    /********************************************************************************** * I.MX6 Linux U- ...

  9. uboot环境变量与内核MTD分区关系

    uboot 与系统内核中MTD分区的关系: 分区只是内核的概念,就是说A-B地址放内核,C-D地址放文件系统,(也就是规定哪个地址区间放内核或者文件系统)等等. 1:在内核MTD中可以定义分区A~B, ...

随机推荐

  1. java中如何使正在运行中的线程退出

    终止线程的三种方法      有三种方法可以使终止线程.      1.  使用退出标志,使线程正常退出,也就是当run方法完成后线程终止.      2.  使用stop方法强行终止线程(这个方法不 ...

  2. 深入理解C++中的explicitkeyword

    深入理解C++中的explicitkeyword kezunhai@gmail.com http://blog.csdn.net/kezunhai C++中的explicitkeyword仅仅能用于修 ...

  3. sql执行计划解析案例(二)

    sql执行计划解析案例(二)   今天是2013-10-09,本来以前自己在专注oracle sga中buffer cache 以及shared pool知识点的研究.但是在研究cache buffe ...

  4. JAVA IO之管道流总结大全(转)

    要在文本框中显示控制台输出,我们必须用某种方法“截取”控制台流.换句话说,我们要有一种高效地读取写入到System.out和 System.err 所有内容的方法.如果你熟悉Java的管道流Piped ...

  5. Core Motion传感器原始数据

    1.访问原始的Motion数据 #import <UIKit/UIKit.h> #import <CoreMotion/CoreMotion.h> @interface Vie ...

  6. 关于js中伪数组

    伪数组: 具有length属性: 按索引方式存储数据: 不具有数组的push().pop()等方法: 伪数组无法直接调用数组方法或期望length属性有什么特殊的行为,不具有数组的push().pop ...

  7. SDWebImage 源码阅读分享

    SDWebImage 源码阅读分享 疑问列表 SDWebImage 整体框架图,主要的类包含哪些 SDWebImage 如何进行缓存管理,过期失效策略,缓存更新 SDWebImage 如何多线程处理的 ...

  8. Bash从路径中获取文件名

    #!/bin/bash basename /etc/hosts

  9. python learning_curve函数

    这个函数需要引用sklearn包 import sklearn from sklearn.learning_curve import learning_curve 这个函数的调用格式是: learni ...

  10. 使用 C# 编程对RTF文档的支持

    http://www.68design.net/Development/Aspnet/Basis-AspNet/26011-1.html