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;

原文地址:https://www.cnblogs.com/wanglouxiaozi/p/9760189.html

时间: 2024-12-13 22:22:48

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

jvm堆内存分布及gc发生的条件

jvm虚拟机对内存管理主要体现在堆内存的管理上,我们可以在启动jvm的时候设置jvm对内存大小及调整策略. 1.jvm启动参数: -Xms:jvm启动时初始堆大小. -Xmx:jvm堆的最大值. -Xss:线程栈大小. -Dname=value:jvm全局属性设置. jvm启动参数设置有很多,以上只是列举本人接触过的几个参数. 1)首先,-Xms是jvm启动时堆内存的初始大小,当堆内存不够用时,jvm调整堆大小到-Xmx设置的大小.一般resin这些服务器会把-Xms和-Xmx大小设置一样以避免

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

arm平台下使用反汇编分析c内存分布: arm:使用arm-linux-objdump命令将编译完成之后的elf文件,进行反汇编. 之后重定向到tmp.s文件中. 第一步变量如下c文件. vim tmp.c #include<stdio.h> #define VAR 0xFF int a = 0; static int b = 0; int c = 10; static int d = 20; const int finalone = 10; const int final; int main

STM32之内存分布与总线

1.总线 系统结构 系统包括一个由多个互相连接的32位AHB总线组成的矩阵 8个主总线 – Cortex-M4 with FPU core I-bus, D-bus and S-bus – DMA1 memory bus – DMA2 memory bus – DMA2 peripheral bus – Ethernet DMA bus – USB OTG HS DMA bus 7个从总线: – Internal Flash memory ICode bus – Internal Flash m

C++ 内存分布

C++内存分布 参考链接http://www.cnblogs.com/skynet/archive/2011/03/07/1975479.html# 作者 吴秦 为什么需要知道C/C++的内存布局和在哪可以可以找到想要的数据?知道内存布局对调试程序非常有帮助,可以知道程序执行时,到底做了什么,有助于写出干净的代码.本文的主要内容如下: 源文件转换为可执行文件 可执行程序组成及内存布局 数据存储类别 一个实例 总结 源文件转换为可执行文件 源文件经过以下几步生成可执行文件: 1.预处理(prepr

C++内存分布 虚表 虚指针(非常重要)

C++内存分布 虚表 虚指针: class Base { public: int m_base; }; class DerivedA: public Base { public: int m_derivedA; }; class DerivedB: public Base { public: int m_derivedB; }; class DerivedC: public DerivedA, public DerivedB { public: int m_derivedC; }; 类结构图:

VS中的类的内存分布(上)

0.序 目前正在学习C++中,对于C++的类及其类的实现原理也挺感兴趣.于是打算通过观察类在内存中的分布更好地理解类的实现.因为其实类的分布是由编译器决定的,而本次试验使用的编译器为VS2015 RC,所以此处的标题为<VS中的类的内存分布>. 1.对无继承类的探索 1.1 空类 我们先一步一步慢慢来,从一个空的类开始. //空类 class test { }; int main(int argc, char *argv[]) { test ts; cout << sizeof(t

C语言内存分布

C语言内存分布 典型的C语言程序内存表示分区共有5个部分: 正文段 Text segment 已初始化数据段(数据段)Initialized data segment 未初始化数据段(bss)Uninitialized data segment 堆 Stack 栈 Heap 具体分布图 各个分区的作用 正文段 CPU执行的机器指令部分 通常可共享 常常是只读的 已初始化数据段(数据段) 包含程序中需明确赋初始值的变量 保存已经初始化的全局变量 未初始化数据段(BSS) 在程序开始执行之前,内核将

C++类的内存分布

使用Visual Studio工具来看是类的内存分布 先选择左侧的C/C++->命令行,然后在其他选项这里写上/d1 reportAllClassLayout,它可以看到所有相关类的内存布局,如果写上/d1 reportSingleClassLayoutXXX(XXX为类名),则只会打出指定类XXX的内存布局.近期的VS版本都支持这样配置. 下面可以定义一个类,像下面这样: class Base { int a; int b; public: void CommonFunction(); };

[转]C++类内存分布

转自:http://www.cnblogs.com/jerry19880126/p/3616999.html 书上类继承相关章节到这里就结束了,这里不妨说下C++内存分布结构,我们来看看编译器是怎么处理类成员内存分布的,特别是在继承.虚函数存在的情况下. 工欲善其事,必先利其器,我们先用好Visual Studio工具,像下面这样一步一步来: 先选择左侧的C/C++->命令行,然后在其他选项这里写上/d1 reportAllClassLayout,它可以看到所有相关类的内存布局,如果写上/d1