• u-boot的内存分布和全局数据结构


    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):
    值的含义也是比较的直观
     1 typedef struct  global_data {
     2   bd_t            *bd;
     3   unsigned long   flags;
     4   unsigned long   baudrate;
     5   unsigned long   have_console;   /* serial_init() was called */
     6   unsigned long   reloc_off;      /* Relocation Offset */
     7   unsigned long   env_addr;       /* Address  of Environment struct */
     8   unsigned long   env_valid;      /* Checksum of Environment valid? */
     9   unsigned long   fb_base;        /* base address of frame buffer */
    10   #ifdef CONFIG_VFD
    11     unsigned char   vfd_type;       /* display type */
    12   #endif
    13   #if 0
    14     unsigned long   cpu_clk;        /* CPU clock in Hz!             */
    15     unsigned long   bus_clk;
    16     unsigned long   ram_size;       /* RAM size */
    17     unsigned long   reset_status;   /* reset status register at boot */
    18   #endif
    19   void            **jt;           /* jump table */
    20 } gd_t; 
    其中flags的可选项如下:
    1 /*
    2 * Global Data Flags
    3 */
    4 #define GD_FLG_RELOC    0×00001         /* Code was relocated to RAM            */
    5 #define GD_FLG_DEVINIT  0×00002         /* Devices have been initialized        */
    6 #define GD_FLG_SILENT   0×00004         /* Silent mode                          */
    其中bd_t数据结构的定义如下:
     1 typedef struct bd_info {
     2   int                 bi_baudrate;    /* serial console baudrate */
     3   unsigned long       bi_ip_addr;     /* IP Address */
     4   unsigned char       bi_enetaddr[6]; /* Ethernet adress */
     5   struct environment_s               *bi_env;
     6   ulong               bi_arch_number; /* unique id for this board */
     7   ulong               bi_boot_params; /* where this board expects params */
     8   struct                              /* RAM configuration */
     9   {
    10     ulong start;
    11     ulong size;
    12   } bi_dram[CONFIG_NR_DRAM_BANKS];
    13   #ifdef CONFIG_HAS_ETH1
    14     /* second onboard ethernet port */
    15     unsigned char   bi_enet1addr[6];
    16   #endif
    17 } bd_t;
  • 相关阅读:
    你不知道的多重循环的事情
    【浅墨Unity3D Shader编程】之三 光之城堡篇:子着色器、通道与标签的写法 & 纹理混合
    ssh 远程登陆指定port
    GMT和CST的转换
    Swift新手教程系列5-函数+selector在swift中的使用方法
    Mac OS X 10.10, Eclipse+ADT真机调试代码时,Device Chooser中不显示真机的解决方式
    android studio 0.8.1使用和遇到问题解决
    C语言之函数调用17—递归法之中的一个般函数的调用(2)
    C语言之基本算法25—牛顿迭代法求方程近似根
    FineUI之使用SQL脚本从数据库表中生成对应的输入控件
  • 原文地址:https://www.cnblogs.com/wanglouxiaozi/p/9760189.html
Copyright © 2020-2023  润新知