uboot 内存布局及启动过程

origin: http://blog.chinaunix.net/xmlrpc.php?r=blog/article&uid=29589379&id=5571499

该布局由uboot.lds 文件定义,在链接时候生成相应的二进制映像。
首先定义起始地址为
0xc3e00000,接下来是中断向量表(Vector),大小为256字节,按每个中断向量占用4个字节的跳转地址算,做多可以有64个中断向量;
2.一些基础性的代码段,它为下一步加载boot或者kernel做准备,其大小为0x1700字节
3.是代码段的后半部分,代码段的大部分代码在这里
4.只读数据区
5.可读写数据区
6.uboot命令代码区
7.未初始化数据段。

uboot启动过程:

       启动uboot                                  启动kernel

众所周知,U-BOOT是存放在FLASH上的。系统启动时,CPU会映射FLASH到它的内存空间(映
射一部分、还是全部FLASH空间?),然后执行 FLASH上的代码。首先,进入
cpu/arc600/start.S中的入口_start,进行内存初始化,接着把U-BOOT的前0x1800字节
从 FLASH复制到内存的0xc3e00000处,也就是链接时的地址;然后对bss段进行清零,设
置堆栈指针,为运行C函数做准备;下一步,运行C函数检测在规定时间内是否有按键发生,
如有则加载boot的后半部分(0x40801800——DATA_END)并启动boot,无则加载kernel并
启动 kernel。U-BOOT启动的前半部分流程如图上图所示.

U-BOOT启动的后半部分,会进行heap、环境变量(env)的初始化,PHY驱动的加载等工作,
然后进入一个无限循环开始shell的运行,shell运行过程中的内存示意如下图所示。


heap和stack依次排列在bss段的后面,图中所示的free area则为U-BOOT未用到的内存。
上图中,heap区域为malloc()提供内存。在uClib库中,malloc()是通过sbrk()或者mmap()
实现的,而sbrk()和 mmap()是在内核中实现的。U-BOOT作为系统最早运行的程序,没有内
核的支持。为了实现malloc(),它定义一个32K的heap区域,在此区域的基础上实现了简
化版的sbrk()。
上图中,stack区域是在U-BOOT启动的前半部分中第三步设置的。它首先根据BSS_END、heap
大小和stack大小算出stack_bottom的值,然后设置堆栈指针SP和帧指针FP为 stack_bottom - 4。
  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值