免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 6705 | 回复: 9
打印 上一主题 下一主题

U-BOOT内存布局及启动过程浅析 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-02-08 23:38 |只看该作者 |倒序浏览
昨天写的文章,放在这里大家分享。

本文以ARC600平台的某一实现为例,对U-BOOT的内存布局和启动方式进行简要的分析。


【内存布局】


在ARC600平台,U-BOOT的内存布局图1所示。

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


有一点比较疑惑的就是U-BOOT命令代码区存放的分明是代码,但它却在数据段。内核中会把一些初始化代码放在数据区,因为这些代码只运行一次,放在数据区可以在内核启动后回收该区域内存。但显然U-BOOT命令不可能只运行一次,为何要把它放在数据段?不解!


【启动过程】


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


U-BOOT启动的后半部分,会进行heap、环境变量(env)的初始化,PHY驱动的加载等工作,然后进入一个无限循环开始shell的运行,shell运行过程中的内存示意如图3所示。其中,heap和stack依次排列在bss段的后面,图中所示的free area则为U-BOOT未用到的内存。


图 3中,heap区域为malloc()提供内存。在uClib库中,malloc()是通过sbrk()或者mmap()实现的,而sbrk()和 mmap()是在内核中实现的。U-BOOT作为系统最早运行的程序,没有内核的支持。为了实现malloc(),它定义一个32K的heap区域,在此区域的基础上实现了简化版的sbrk()。


图3中,stack区域是在U-BOOT启动的前半部分中第三步设置的。它首先根据BSS_END、heap大小和stack大小算出stack_bottom的值,然后设置堆栈指针SP和帧指针FP为stack_bottom - 4。

[ 本帖最后由 bitmilong 于 2009-2-10 09:16 编辑 ]

U-BOOT内存布局及启动过程浅析v1.2.pdf

81.17 KB, 下载次数: 455

评分

参与人数 1可用积分 +30 收起 理由
yidou + 30 原创内容

查看全部评分

论坛徽章:
5
2 [报告]
发表于 2009-02-09 08:59 |只看该作者
从BD转过来的吗? 图片不可见阿

论坛徽章:
0
3 [报告]
发表于 2009-02-09 09:19 |只看该作者
附件应该是全的

论坛徽章:
5
4 [报告]
发表于 2009-02-09 09:52 |只看该作者
下载了, 赞一个

论坛徽章:
0
5 [报告]
发表于 2009-02-10 08:56 |只看该作者
前两天没注意,图片竟然不能显示,现在已经当作附件传上来了。

另外有两个地方不太明白,一是U-BOOT的命令代码区为何在数据段,二是启动时CPU是映射一部分FLASH地址空间到它的内存空间还是全部。希望有知道的解释一下,谢谢!

论坛徽章:
0
6 [报告]
发表于 2009-02-10 09:18 |只看该作者
把楼主帖子编辑了一下, 图片放到文章里看起来方便些, 在附件图片那行点 [插入] 就行了

感谢分享

论坛徽章:
0
7 [报告]
发表于 2009-02-10 09:22 |只看该作者

回复 #6 bitmilong 的帖子

原来图片这样插入的啊,学习了

论坛徽章:
0
8 [报告]
发表于 2011-01-28 17:30 |只看该作者
回复 1# cugfeng


    我来解释一下吧。
按个UBOOT_CMD不是代码,而是命令的一个结构体,里面包含里命令对应的函数地址、名称等一系列信息。当你输入命令的时候会有函数从这个区域中查找,找出命令名对应的代码函数。真正的命令代码还是在代码区域。仔细看看u-boot.lds就知道了。

论坛徽章:
0
9 [报告]
发表于 2011-02-12 15:17 |只看该作者
kan kan xie xie

论坛徽章:
0
10 [报告]
发表于 2011-02-17 11:05 |只看该作者
8楼正解
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP