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;

最新文章

  1. 总结-computer
  2. 关于iOS中的时间
  3. 自定义tab在地图进行分页显示
  4. Shader中贴图知识汇总: 漫反射贴图、凹凸贴图、高光贴图、 AO贴图、环境贴图、 光照纹理及细节贴图
  5. 二、理解over()函数
  6. 接触.net5年了,感觉自己的知识面很狭隘。
  7. Python - 安全替换字符串模板(safe_substitute) 详细解释
  8. java 判断是否大于指定版本号
  9. Java并发框架AbstractQueuedSynchronizer(AQS)
  10. thinkphp常用标签总结
  11. Robot - 1. robot framework环境搭建
  12. update与select关联执行效率问题
  13. PostgreSQL 扩展开发基础教程
  14. C#生成二维码(可保存二维码图片)
  15. cocos2d接安卓facebook插件(已测cocos-x 3.7 3.8版本)
  16. 20155333 2016-2017-2 《Java程序设计》第八周学习总结
  17. Automapper实现自动映射
  18. Keil RTX使用 os_mut_init 报Hard Fault 错误解决记录
  19. python学习(九) 网络编程学习--简易网站服务器
  20. Lucene.Net 3.0.3如何从TokenStream中获取token对象

热门文章

  1. [ BZOJ 3445 ] Roadblock
  2. 解决Android弹出软键盘导致的问题
  3. html5——全屏滚动
  4. Linux Shell ssh登录脚本
  5. Discuz 取消 应用更新提醒 方法
  6. IOS: Xcode报 Undecleared selector Warning错误的解决方法
  7. 调用CAD内的颜色选择对话框
  8. UpdateData
  9. 单实例redis分布式锁的简单实现
  10. /etc目录常用配置文件