U-boot,除非在RAM中调试,一般情况下都是从flash中执行一段代码,然后将flash中储存的代码和数据搬移到ram中,然后跳转到ram中执行。当然这应该也是一般的bootloader的执行方式,
大家都差不多,但是各个bootloader的内存规划(栈,堆之类的)也 不太一样,而且u-boot还在内存空间中规划了一些用于存放环境变量和一些数据结构的空间,所以如果不了解一下的话,直接
看代码的话就会有一点迷糊。有必要先介绍一下。
关于u-boot的内存分布,或者说内存映射,网上有人画了一幅图,比较的清晰,如下:
 
上面的图上其实漏了一个部分,就是在flash中,一般情况在紧跟U-boot映像的后面,还有一个存放环境变量的区域(不过这个区域好像是可选可不选的),一般都是在flash中取一个sector来存放环境变量。
  • U-boot映像:U-boot烧写进flash的映像,在uboot的术语中,这部分的大小叫做monitor_size.所以在uboot中,这个二进制文件就叫做monitor.这个U-boot映像会被运送到RAM中,从图中也可以看见RAM中有一块也是U-boot映像。
  • 环境变量区域:环境变量存放在flash和RAM中各一份,在flash中一般存放在紧随Monitor也即U-boot镜像的下一个sector中,存储一些诸如IP地址等信息,在程序被拷贝到RAM中时,环境变量也同时被拷贝到RAM中。
  • CFG_MALLOC_LEN:这个区域是用来存放堆数据和环境变量的,这个区域是紧接着RAM中的U-boot镜像的,从图中也可以看出,在U-boot的基地址往下开辟了这一段区域。环境变量在本来保存在FLASH中,在系统初始化的时候,flash中的这些环境变量也同样被复制到RAM中,在系统运行的时候,可以修改RAM中的值来改变系统的环境变量,但是掉电重启后,还是用的FLASH中的设定值,当然也可以写flash来改变默认的环境变量。
  • GBL_DATA_SIZE:这个区域是紧接着CFG_MALLOC_LEN数据段的,从图上也可以看出来,这一段是用来存放一个gd_t数据结构的,这个数据是一个uboot中用到的数据结构,用来存放系统的一些信息,在下面会列出这个数据结构
  • 另外,在SDRAM_BASE开始的地址上,一般存放着二级跳转中断向量,这些中断向量一般是用来为uclinux等操作系统用的。
  • 其他的如栈的分布如上图所示。

下面列出在uboot中使用的gt_d数据结构的定义(arm):
值的含义也是比较的直观
 typedef struct  global_data {
  bd_t *bd;
  unsigned long flags;
  unsigned long baudrate;
  unsigned long have_console; /* serial_init() was called */
  unsigned long reloc_off; /* Relocation Offset */
  unsigned long env_addr; /* Address of Environment struct */
  unsigned long env_valid; /* Checksum of Environment valid? */
  unsigned long fb_base; /* base address of frame buffer */
  #ifdef CONFIG_VFD
    unsigned char vfd_type; /* display type */
  #endif
  #if 0
    unsigned long cpu_clk; /* CPU clock in Hz! */
    unsigned long bus_clk;
    unsigned long ram_size; /* RAM size */
    unsigned long reset_status; /* reset status register at boot */
  #endif
  void **jt; /* jump table */
} gd_t;
其中flags的可选项如下:

 /*
* Global Data Flags
*/
#define GD_FLG_RELOC 0×00001 /* Code was relocated to RAM */
#define GD_FLG_DEVINIT 0×00002 /* Devices have been initialized */
#define GD_FLG_SILENT 0×00004 /* Silent mode */
其中bd_t数据结构的定义如下:
 typedef struct bd_info {
  int bi_baudrate; /* serial console baudrate */
  unsigned long bi_ip_addr; /* IP Address */
  unsigned char bi_enetaddr[]; /* Ethernet adress */
  struct environment_s *bi_env;
  ulong bi_arch_number; /* unique id for this board */
  ulong bi_boot_params; /* where this board expects params */
  struct /* RAM configuration */
  {
    ulong start;
    ulong size;
  } bi_dram[CONFIG_NR_DRAM_BANKS];
  #ifdef CONFIG_HAS_ETH1
    /* second onboard ethernet port */
    unsigned char bi_enet1addr[];
  #endif
} bd_t;

u-boot的内存分布和全局数据结构的更多相关文章

  1. VC++中的类的内存分布(上)

    0.序 目前正在学习C++中,对于C++的类及其类的实现原理也挺感兴趣.于是打算通过观察类在内存中的分布更好地理解类的实现.因为其实类的分布是由编译器决定的,而本次试验使用的编译器为VS2015 RC ...

  2. VC++中的类的内存分布(上)(通过强制转换,观察地址,以及地址里的值来判断)

    0.序 目前正在学习C++中,对于C++的类及其类的实现原理也挺感兴趣.于是打算通过观察类在内存中的分布更好地理解类的实现.因为其实类的分布是由编译器决定的,而本次试验使用的编译器为VS2015 RC ...

  3. u-boot的内存分布

    cpu会自动从NAND flash 中读取前4KB的数据放置在片内SRAM里(s3c2440是soc),同时把这段片内SRAM映射到nGCS0片选的空间(即0x00000000).cpu是从0x000 ...

  4. C语言内存分布

    C语言内存分布 典型的C语言程序内存表示分区共有5个部分: 正文段 Text segment 已初始化数据段(数据段)Initialized data segment 未初始化数据段(bss)Unin ...

  5. 使用汇编分析c代码的内存分布

    arm平台下使用反汇编分析c内存分布: arm:使用arm-linux-objdump命令将编译完毕之后的elf文件,进行反汇编. 之后重定向到tmp.s文件里. 第一步变量例如以下c文件. vim ...

  6. 程序的内存分布 - 以 Linux 为例,基于 C 语言分析

    这里以 Linux 为例,用 C 语言进行演示. 内存模型 - 内存空间名称 内容 读写操作 分配时机 高地址 kernel 内核空间 命令行参数.环境变量等 不可读写 程序运行时 - stack 栈 ...

  7. C++类内存分布

    http://www.cnblogs.com/jerry19880126/p/3616999.html#undefined 书上类继承相关章节到这里就结束了,这里不妨说下C++内存分布结构,我们来看看 ...

  8. C++ 类的内存分布

    C++类内存分布 转自:http://www.cnblogs.com/jerry19880126/p/3616999.html   先写下总结,通过总结下面的例子,你就会明白总结了. 下面总结一下: ...

  9. C++ 继承之虚继承与普通继承的内存分布

    仅供互相学习,请勿喷,有观点欢迎指出~ class A { virtual void aa(){}; }; class B : public virtual A { ]; //加入一个变量是为了看清楚 ...

随机推荐

  1. Leetcode0006--ZigZag Conversion

    [转载请注明]https://www.cnblogs.com/igoslly/p/9017638.html 来看一下题目: The string "PAYPALISHIRING" ...

  2. css3背景渐变色代码

    从上到下 #grad {  background: -webkit-linear-gradient(red, blue);  background: -o-linear-gradient(red, b ...

  3. (三)Python 学习第三天--GUI桌面项目

    (代码参考了别人的代码,只做学习用途!!!最近因为写论文,好久没有记录,好内疚...今天学习了一个小案例,做一下) 主要使用模块:tkinter 代码如下: from tkinter import * ...

  4. Centos6.7 编译安装 Apache PHP

    Centos6.7 编译安装 Apache PHP 原文地址:http://www.cnblogs.com/caoguo/p/4968039.html ##### Apache 编译安装 #### [ ...

  5. Mysql 之主从复制,mysql-proxy读写分离

    准备两台mysql服务器,master(192.168.43.64).slave(192.168.84.129) master配置: log-bin=mysql-bin binlog_format=m ...

  6. JavaScript ES 数组系列

    正文从这开始- ECMAScript 5.1 中提供的数组方法 其中部分方法,ECMAScript 3 就出现了,但是本文不再细分. ECMA-262/5.1 规范:https://www.ecma- ...

  7. php连接数据库的两种方式

    一.mysqli方式连接数据库 $mysql_conf = array( 'host' => 'localhost:3306', 'db' => 'ssql', 'db_user' =&g ...

  8. 27.7 并行语言集成查询(PLinq)

    static void Main() { ObsoleteMethods(Assembly.Load("mscorlib.dll")); Console.ReadKey(); } ...

  9. [如何在mac下使用gulp] 2. gulp模块的常用方法

    常用的gulp模块方法有: gulp.src() gulp.src('client/one.js'); //指定明确的要处理文件 gulp.src('client/*.js'); //处理client ...

  10. Shell 脚本编程 基本语法:

    Shell 脚本编程语法: 注: 文章来源 http://www.cnblogs.com/yunquan/p/6821850.html 视频来源:https://www.bilibili.com/vi ...