通过make 100ask24x0_config 指令配置好芯片选型后,使用make指令来生成uboot.bin文件
  本文学习目标: 

对Makefile文件进行基本了解,掌握make指令是怎么实现生成uboot.bin的过程

1.接下来开始分析make指令,首先打开u-boot-1.1.6/Makefile文件:

117 include $(OBJTREE)/include/config.mk               //调用config.mk这个文件
118
...
124 ifeq ($(ARCH),ppc)        //判断config.mk这个文件中ARCH是否等于ppc
125 CROSS_COMPILE = powerpc-linux-
126 endif
127 ifeq ($(ARCH),arm) //判断config.mk这个文件中ARCH是否等于arm
128 CROSS_COMPILE = arm-linux-
129 endif
...
164 include $(TOPDIR)/config.mk

  

因为执行了make 100ask24x0_config 后,其中include/config.mk内容为:

ARCH = arm
CPU = arm920t
BOARD = 100ask24x0
SOC = s3c24x0

由于ARCH=arm,所以第127行为真,执行第128行语句使用arm-linux-来制定交叉编译器前缀。
其中第164行的config.mk是属于顶层目录的config,主要通过arm,arm920t,100ask24x0,s3c24x0来确定编译器、编译选项等
2.打开config.mk(主要作用如下几段):

45 PLATFORM_LDFLAGS =
...
88 BOARDDIR = $(BOARD) //$(BOARD)=100ask24x0
...
91 sinclude $(TOPDIR)/board/$(BOARDDIR)/config.mk //调用 board/100ask24x0/config.mk中第25行"TEXT_BASE=0x33F80000."
...
143 LDSCRIPT := $(TOPDIR)/board/$(BOARDDIR)/u-boot.lds //LDSCRIPT=.//board/100ask24x0/u-boot.lds
...
189 LDFLAGS += -Bstatic -T $(LDSCRIPT) -Ttext $(TEXT_BASE) $(PLATFORM_LDFLAGS)

如下图,通过grep查找内容指令可以看出u-boot设置的TEXT_BASE地址为0x33F80000(若boot太大或SDRAM太小,可以减小TEXT_BASE基地址)

相当于向LDFLAGS内容中追加了"-T board/100ask24x0/u-boot.lds -Ttext 0x33F80000"字段,(LDFLAGS:属于u-boot第四个依赖文件)

3.继续看makefile:

169 OBJS = cpu/$(CPU)/start.o                                //u-boot需要的目标文件,OBJS等于目标文件cpu/$(CPU)/start.o
...
193 LIBS = lib_generic/libgeneric.a //u-boot需要的库文件,LIBS等于库文件lib_generic/libgeneric.a 
194 LIBS += board/$(BOARDDIR)/lib$(BOARD).a //追加库文件board/100ask24x0/lib100ask24x0.a
195 LIBS += cpu/$(CPU)/lib$(CPU).a //追加库文件cpu/arm920t/libarm920t.a
... 214 LIBS := $(addprefix $(obj),$(LIBS))        //addprefix为加前缀函数,其中obj=空,所以LIBS地址不变 ...
222 SUBDIRS = tools \           //SUBDIRS伪命令:用来执行tools,examples,post,post\cpu子目录下面的make文件。
223 examples \
224 post \
225 post/cpu
...
239 ALL = $(obj)u-boot.srec $(obj)u-boot.bin $(obj)System.map $(U_BOOT_NAND) //all的依赖文件
240
241 all: $(ALL)        //使用make命令,相当于执行make all
...
249 $(obj)u-boot.bin: $(obj)u-boot              //生成u-boot.bin需要elf格式的u-boot,elf也就是通过ld链接文件生成的。
250 $(OBJCOPY) ${OBJCFLAGS} -O binary $< $@              //执行:arm-linux-objcopy -O binary u-boot u-boot.bin
... 262 $(obj)u-boot: depend version $(SUBDIRS) $(OBJS) $(LIBS) $(LDSCRIPT) //生成elf格式的u-boot所需要的依赖文件
263 UNDEF_SYM=`$(OBJDUMP) -x $(LIBS) |sed -n -e 's/.*\(__u_boot_cmd_.*\)/-u\1/p'|sort|uniq`;\
264 cd $(LNDIR) && $(LD) $(LDFLAGS) $$UNDEF_SYM $(__OBJS) \
265 --start-group $(__LIBS) --end-group $(PLATFORM_LIBS) \
266 -Map u-boot.map -o u-boot

在第263行和266行翻译出内容如下所示:


UNDEF_SYM=`arm-linux-objdump -x lib_generic/libgeneric.a board/100ask24x0/lib100ask24x0.a cpu/arm920t/libarm920t.a cpu/arm920t/s3c24x0/libs3c24x0.a lib_arm/libarm.a fs/cramfs/libcramfs.a fs/fat/libfat.afs/fdos/libfdos.a fs/jffs2/libjffs2.a fs/reiserfs/libreiserfs.a fs/ext2/libext2fs.a net/libnet.a disk/libdisk.a rtc/librtc.a dtt/libdtt.a drivers/libdrivers.a drivers/nand/libnand.a drivers/nand_legacy/libnand_legacy.a drivers/usb/libusb.a drivers/sk98lin/libsk98lin.a common/libcommon.a

|sed -n -e 's/.*\(__u_boot_cmd_.*\)/-u\1/p'|sort|uniq`;\

cd /work/system/u-boot-1.1.6 &&
arm-linux-ld -Bstatic -T /work/system/u-boot-1.1.6/board/100ask24x0/u-boot.lds -Ttext 0x33F80000
$UNDEF_SYM cpu/arm920t/start.o \
--start-group
lib_generic/libgeneric.a board/100ask24x0/lib100ask24x0.a
cpu/arm920t/libarm920t.a cpu/arm920t/s3c24x0/libs3c24x0.a lib_arm/libarm.a
fs/cramfs/libcramfs.a fs/fat/libfat.a fs/fdos/libfdos.a fs/jffs2/libjffs2.a
fs/reiserfs/libreiserfs.a fs/ext2/libext2fs.a net/libnet.a disk/libdisk.a
rtc/librtc.a dtt/libdtt.a
drivers/libdrivers.a
drivers/nand/libnand.a
drivers/nand_legacy/libnand_legacy.a
drivers/usb/libusb.a
drivers/sk98lin/libsk98lin.a
common/libcommon.a
--end-group -L
/work/tools/gcc-3.4.5-glibc-2.3.6/lib/gcc/arm-linux/3.4.5 -lgcc \
-Map u-boot.map -o u-boot


在第263行和266行就是在制作elf格式的u-boot, 其中$(LIBS)$(__LIBS)就是库文件,$(LD)为连接选项,$(__OBJS)为目标文件,
 $(LDFLAGS)指定程序的布局与地址,为"/work/system/u-boot-1.1.6/board/100ask24x0/u-boot.lds -Ttext 0x33F80000 ..."

4.board/100ask24x0/u-boot.lds文件如下所示:

	OUTPUT_ARCH(arm)                        //设置输出文件的体系架构。
ENTRY(_start) //将_start这个全局符号设置成入口地址,进行复位初始化
SECTIONS //输出文件的内容布局
{
. = 0x00000000; //指定地址0x00000000,最终运行地址在0x33F80000+0x00000000 . = ALIGN(4); //代码以4字节对齐
.text : //指定.text section段(位于0x33F80000)
{
cpu/arm920t/start.o (.text) //添加第一个目标文件cpu/arm920t/start.o里面的.text代码段
board/100ask24x0/boot_init.o (.text) //添加第二个目标文件board/100ask24x0/boot_init.o里面的.text代码段
*(.text) //*(.data) 表示添加剩下的全部文件的.text代码段
} . = ALIGN(4);
.rodata : { *(.rodata) } //指定.rodata section段(位于0x33F80000+.text section),将所有的.rodata只读数据段合并成一个.rodata只读数据段 . = ALIGN(4);
.data : { *(.data) } //指定读写数据段 . = ALIGN(4);
.got : { *(.got) } //指定got段,got段是uboot自定义的一个段 . = .;
__u_boot_cmd_start = .; //把__u_boot_cmd_start赋值为当前位置, 即起始位置
.u_boot_cmd : { *(.u_boot_cmd) } // u_boot_cmd段,所有的u-boot命令相关的定义都放在这个位置
__u_boot_cmd_end = .; // *u_boot_cmd段结束位置 . = ALIGN(4);
__bss_start = .; //把__bss_start赋值为当前位置,即bss段的开始位置
.bss : { *(.bss) } //指定bss段,这里NOLOAD的意思是这段不需装载,仅在执行域中才会有这段
_end = .; //把_end赋值为当前位置,即bss段的结束位置
}

第1阶段——u-boot分析之make指令(2)的更多相关文章

  1. 自己动手写CPU之第七阶段(2)——简单算术操作指令实现过程

    将陆续上传本人写的新书<自己动手写CPU>.今天是第25篇.我尽量每周四篇 亚马逊的预售地址例如以下,欢迎大家围观呵! http://www.amazon.cn/dp/b00mqkrlg8 ...

  2. 自己动手写处理器之第四阶段(1)——第一条指令ori的实现

    将陆续上传本人写的新书<自己动手写处理器>(尚未出版),今天是第11篇,我尽量每周四篇 第4章 第一条指令ori的实现 前面几章介绍了非常多预备知识,也描绘了即将要实现的OpenMIPS处 ...

  3. shell分析日志常用指令合集

    数据分析对于网站运营人员是个非常重要的技能,日志分析是其中的一个.日志分析可以用专门的工具进行分析,也可以用原生的shell脚本执行,下面就随ytkah看看shell分析日志常用指令有哪些吧.(log ...

  4. 第3阶段——内核启动分析之prepare_namespace()如何挂载根文件系统和mtd分区介绍(6)

    内核启动并初始化后,最终目的是像Windows一样能启动应用程序,在windows中每个应用程序都存在C盘.D盘等,而linux中每个应用程序是存放在根文件系统里面,那么挂载根文件系统在哪里,怎么实现 ...

  5. 第3阶段——内核启动分析之start_kernel初始化函数(5)

    内核启动分析之start_kernel初始化函数(init/main.c) stext函数启动内核后,就开始进入start_kernel初始化各个函数, 下面只是浅尝辄止的描述一下函数的功能,很多函数 ...

  6. 第3阶段——内核启动分析之创建si工程和分析stext启动内核函数(4)

    目标: (1)创建Source Insight 工程,方便后面分析如何启动内核的 (2)分析uboot传递参数,链接脚本如何进入stext的  (3) 分析stext函数如何启动内核:  (3.1) ...

  7. 第3阶段——内核启动分析之make uImage编译内核(3)

    目标: 通过分析makefile,明白make uImage如何编译内核 把整个内核的makefile分成三类(makefile资料文档在linux-2.6.22.6/Documentation/bu ...

  8. 团队作业7——alpha阶段之事后诸葛亮分析

    事后诸葛亮分析 1. 设想和目标 1.1 我们的软件要解决什么问题?是否定义得很清楚?是否对典型用户和典型场景有清晰的描述? 解决查询物流信息步骤繁琐的问题.定义还算清楚.典型用户主要针对一些不熟悉淘 ...

  9. STM32F103 ucLinux开发之一(BOOT分析及源码)

    STM32F103 ucLinux开发BOOT STM3210E-EVAL官方开发板主芯片STM32F103ZET6: 片内512K Flash,地址0x0800 0000 ~ 0x0807 FFFF ...

随机推荐

  1. 银河英雄传说[NOI2002]

    题目描述 公元五八○一年,地球居民迁移至金牛座α第二行星,在那里发表银河联邦创立宣言,同年改元为宇宙历元年,并开始向银河系深处拓展.       宇宙历七九九年,银河系的两大军事集团在巴米利恩星域爆发 ...

  2. charAt()的功能

    <script type="text/javascript"> var str="Hello world!" document.write(str. ...

  3. SpringMVC+Mybatis实现的Mysql分页数据查询

    周末这天手痒,正好没事干,想着写一个分页的例子出来给大家分享一下. 这个案例分前端和后台两部分,前端使用面向对象的方式写的,里面用到了一些回调函数和事件代理,有兴趣的朋友可以研究一下.后台的实现技术是 ...

  4. Linux操作系统-命令-top

    当我们在执行性能测试的时候,需要关注 业务性能指标(业务监控) 吞吐量(TPS) 响应时间 平均响应时间 50%用户响应时间 90%用户响应时间 标准差 # TPS标准差越小,说明波动越小,系统越稳定 ...

  5. append()方法生成的元素绑定的事件失效解决办法

    我使用append()方法动态生成的a链接的click事件没有起效果,查找了资料,了解到,我使用的onclick方法绑定的事件对动态生成的元素是无效的,解决办法如下: 使用事件委托,并且要用on来绑定 ...

  6. 【SSH】---【Struts2、Hibernate5、Spring4】【SSH框架整合笔记 】

    一.为什么要使用接口? 三层体系架构上层调用下层的时候最好使用接口,比如action层调用service的时候,private IUserDAO userDAO;这里将属性定义为接口,调用DAO的时候 ...

  7. 【物联网云端对接-4】通过MQTT协议与百度云进行云端通信

    百度云的天工物联网服务目前包括:物接入.物解析.物管理.时序数据库和规则引擎等5大部分,本篇文章仅介绍物接入. 天工物联网的物接入,从开发者的角度来说相对有些复杂,需要多步操作才能实现一个云设备的创建 ...

  8. css3多列及瀑布流效果

    css3内容分块,多列效果(类似报纸版块排版): .div02{ /*count:内容分为几列,gap:内容与分割线的距离,rule:分割线样式*/ column-count:; column-gap ...

  9. html&css笔记(2)

    第9章 用background-image属性为任何元素添加背景图片,用url()标识背景位置,它落在背景颜色之上,所以类似于背景颜色,它位于边框之内 p380 可以指定任一边框(上.下.左.右)的样 ...

  10. HTML进阶

    HTML表单 form标签 <form> 标签代表一个表单,表单用于向服务器传输数据. 标签能够包含 <input> ,可以是文本字段,复选框,单选框或提交按钮等.还可以包含& ...