uboot 配置 编译 连接全过程

上传人:ba****u6 文档编号:184195546 上传时间:2023-02-01 格式:DOCX 页数:31 大小:48.75KB
返回 下载 相关 举报
uboot 配置 编译 连接全过程_第1页
第1页 / 共31页
uboot 配置 编译 连接全过程_第2页
第2页 / 共31页
uboot 配置 编译 连接全过程_第3页
第3页 / 共31页
点击查看更多>>
资源描述
uboot配置编译连接全过程分类:Uboot 2011-11-14 20:48 415人阅读 评论(1)收藏 举报根据README中Porting Guide的指示精神,我们要在 新板子上移植UBoot,最快速的办法就是查看当前UBoot 代码中是否有对相似于待移植板子的其他板子的支持(这应 该又是一个可考虑成为习惯甚至本能的做法。也即拿到不熟 悉的软件包后,看看里面有没有自己熟悉的、或者和自己目 前要做的东西很相似的部分,从这个部分入手往往能很快的 解决问题)。很幸运,我们在里面找到了三星公司所生产的 SMDK2410参考板,这是三星公司早先为推销其生产的 ARM9芯片-S3C2410所推出的一块PCB参考设计板(推出 时随板子附加了很多的软硬件资料)。知道这个后,我们很高 兴,因为我们知道我们板子上的CPUS3C2440正是 S3C2410的升级版。所以,在真正动手移植之前,分析一 下新版本UBoot中如何支持SMDK2410的,自然成为接下 来要做的事情。UBoot本身是用GNU工具链开发的,那这就意味着其代码 包里面必然会有很多的Makefile文件,因为GNU Make正 是用来管理软件项目编译的GNU工具。而且,正如我们前 面说的,UBoot能支持如此多的CPU体系结构和操作系统, 那它就必定会有很多的配置选项用于配置。所以分析支持SMDK2410参考板的具体代码之前,我们必须先弄懂 UBoot的配置编译过程。我们只有对此了然于胸了,才能比 较顺利的完成移植。所幸的是,不像Linux内核代码,UBoot 的代码量并不多,分析起来并不痛苦。作为UBoot学习移植系列的第一篇文章,我在这里就以 SMDK2410板子的支持作为例子,分析新版本UBoot(2010.06)的配置编译过程。作为前提,你应该知道一 些 GNU Make 以及一些 Bash Shell Script 的知识。从UBOOT用户的角度来讲,其编译配置过程倒是非常的简 单,只需要在命令行中切换到UBoot目录下输入两个命令 csicongjuliantec u-boot-2010.06$ make ARCH=arm CROSS_COMPILE=arm-linux- smdk2410_config csicongjuliantec u-boot-2010.06$ make ARCH=arm CROSS_COMPILE=arm-linux-第一个命令完成UBoot for smdk2410参考板的配置,第二 个命令则真正编译出所需要的UBoot二进制映像文件,编 译出来之后我们需要将其下载到FLASH中。在这两个命令 中,参数ARCH表示我们要给具有何种体系结构的CPU编 译UBoot,因为不管SMDK2410参考板上的CPUS3C2410,还是我手头板子上的CPU,皆为ARM9 芯片,所以这里显然应该为arm; CROSS_COMPILE为交 叉编译工具链各工具的名称前缀。我们需要用到arm-linux-gcc 作为编译器、arm-linux-ld 为链接器。 所以这里取值为arm-linux-。在第一个命令中,我们以smdk2410_config作为本次 make的目标。查找UBoot项目顶层Makefile得到关于 此目标的规则如下: smdk2410_config :unconfig$(MKCONFIG) $(:_config=) arm arm920t smdk2410 Samsung s3c24x0根据Makefile规则的定义,GNU Make在处理这条规则的 时候,先判断其依赖也就是unconfig是否需要更新而我们在同一 Makefile中找到unconfig的规则为(482 行):unconfig:rm -f $(obj)include/config.h $(obj)include/config.mk$(obj)board/*/config.tmp$(obj)board/*/*/config.tmp $(obj)include/autoconf.mk$(obj)include/autoconf.m k.dep由于目录下没有一个叫unconfig的文件存在,所以和 unconfig相关的这条规则总是得到处理,也就是其中的rm命令总是得到执行,该命令的目的是删除一些配置编译 过程中产生的文件。在这些文件中,与本文讨论密切相关的 是前面两个,以及后面两个。前面两个是用第一条命令来配 置UBoot的过程中产生的,后面则是用第二条命令来编译 UBoot的过程中产生的。这条规则先把他们全部删除。注意 rm命令前面的符号是取消该命令执行时的回显。执行完对依赖unconfig的处理,GNU Make回到对smdk2410_config的处理。它接下来执行命令:$(MKCONFIG) $(:_config=) arm arm920t smdk2410 Samsung s3c24x0在这条命令中,$(MKCONFIG)指代的就是UBoot根目录 下的mkconfig脚本,因为你可以在同一 Makefile中找到 该变量的定义:MKCONFIG := $(SRCTREE)/mkconfigexport MKCONFIG其中$(SRCTREE)指代的就是UBoot根目录。另外在上 面的命令中,$(:_config=)的部分实际上是处理自动变量 $,也就是第一次make的目标smdk2410_config,这 里将其中_config的部分用空来代替。去掉_config的部 分后,剩余的smdk2410也就是三星参考板的名称。所以 最后上面的命令也就可直接写作:./mkconfig smdk2410 arm arm920t smdk2410Samsung s3c24x0 很清楚,执行mkconfig脚本,并传之以所在的目录名称, sansung是产商名称,s3c24x0是对应的SOC芯片名称。 有人对arm920和s3c24x0两者所指东西混淆不清,我自 己在平时为方便起见也经常混用这两个词,有时候也将它们 统称为CPU。但实际上,更精确的说法认为arm920t是arm9 类型的CPU核,而s3c2410则是用该核搭配另外一些外设 做在一块芯片内形成的SOC芯片。由于三星本身出了很多 使用arm920tCPU核的芯片,如s3c2400、s3c2410以及 s3c2440,所以在UBoot代码中,用s3c24x0来统称这一 类SOC芯片。mkconfig脚本是bash脚本。对应于smdk2410参考板其主要做三件事情:1,在include目录下制作一些软连接,参见代码:# Create link to architecture specific headers#if $SRCTREE” != $OBJTREE ; thenmkdir -p $OBJTREE/includemkdir -p $OBJTREE/include2cd $OBJTREE/include2rm -f asmln -s $SRCTREE/arch/$2/include/asm asmLNPREFIX=$SRCTREE/arch/$2/include/asm/ cd ./include rm -f asmln -s $SRCTREE/arch/$2/include/asm asm elsecd ./includerm -f asmln -s ./arch/$2/include/asm asmfirm -f asm/archif -z $6 -o $6 = NULL ; thenln -s $LNPREFIXarch-$3 asm/arch elseln -s $LNPREFIXarch-$6 asm/archfiif $2 = arm ; then rm -f asm/proc ln -s $LNPREFIXproc-armv asm/procfi由于我们编译UBoot时,通常都是在UBoot原有目录下编译的,并且针对smdk2410参板,$2=arm,$6=s3c24x0,所以,以上代码的效果等同于我们用下面这些命令来手工创建软连接csicongjuliantec include$ ln-s ./arch/arm/include/asm ./asmcsicongjuliantec include$ ln -sarch-s3c24x0 ./asm/archcsicongjuliantec include$ ln -sproc-armv ./asm/proc2,在include目录下制作顶层Makefile要包含的文件include/config.mk,参见代码:# Create include file for Make#echo ARCH=$2config.mkecho CPU=$3config.mkecho BOARD=$4config.mk$5 & $5 != NULL & echo VENDOR = $5 config.mk$6 & $6 != NULL & echo SOC = $6 config.mk很明显,制作出来的文件include/config.mk,其内容非常 简单,只包括 ARCH、CPU、BOARD、VENDOR、SOC等变量的定义。后面我们会知道,这个文件虽然简单,但是 却决定了顶层Makefile的一大部分逻辑框架。3,在include目录下制作产生特定于smdk2410参考板的 头文件include/config.h,参见代码:# Assign board directory to BOARDIR variableif -z $5 -o $5 = NULL ; thenBOARDDIR=$4elseBOARDDIR=$5/$4fi# Create board specific header file#if $APPEND = yes # Append to existingconfig file thenecho config.helse config.h# Create new configfilefiecho /* Automatically generated - do not edit*/ config.hfor i in $TARGETS ; doecho #define CONFIG_MK_$i 1 config.h ;donecat config.h#define CONFIG_BOARDDIR board/$BOARDDIR#include #include #include EOF需要说明的是,上面一行 config.h的作用是创建一个 空文件。有的同志可能不太知道,你可以在shell提示符下 试验一下,其效果就和用touch命令一样。这段代码会创 建文件include/config.h,其内容如下:/* Automatically generated - do not edit */#define CONFIG_BOARDDIR board/samsung/smdk2410#include #include #include 至此,针对smdk2410参考板来配置新版本的UBoot代码 完成了,接下来,我们能使用上面的第二个命令来编译可以 该参考板上引导Linux内核的UBoot 了。在讨论编译UBoot的第二个命令之前,你需要稍微看一下 UBoot顶层Makefile的内容,其实里面最重要的部分就是 一个条件判断结构,抽出代码如下: ifeq ($(obj)include/config.mk,$(wildcard$(obj)include/config.mk)/Aelse # !config.mkall $(obj)u-boothex $(obj)u-boot,srec $(obj)u-bootbin $(obj)u-bootimg $(obj)u-bootdis $(obj)u-boot $(filter-out tools,$(SUBDIRS) $(TIMESTAMP_FILE) $(VERSION_FILE) gdbtools updater env depend dep tags ctags etags cscope Slobjystemfap:echo System not configured - see README &2 exit 1tools:$(MAKE) -C toolstools-all:$(MAKE) -C tools HOST_TOOLS_ALL=yendif # config.mk ./B e?a?这个判断结构,其实就是看是否存在文件 include/config.mk,如果存在的,则说明第一步的配置过 程已经完成,因为这个文件正式配置过程中产生的。所以此 时GNU Make就会处理上面代码中的A部分,否则就会处理else后面、endif前面的部分。从这里我们可以看出,如 果不对UBoot进行配置,而直接去编译,那么它会给出一 个警告,并要求我们去看READMEo上面中的B部分就是UBoot中对各种所支持板子的规则定义,其中包括了我们前面提到过的对应于smdk2410_config的规则。上面代码中的A部分是整个顶层Makefile的精华所在, 其中包含了生成UBoot二进制映像的大部分规则定义,也 是我们关注的重点。好了,知道这样一个框架后,我们再回 头来看看第二个命令的编译过程。在开头提到的第二个命令中,我们并没有给make指定一 个目标,所以按照GNU Make的规定,它将去着手处理默 认规则,也即出现在顶层Makefile第一个规则all,如下:# Always append ALL so that arch config.mks can add custom onesALL += $(obj)u-boot.srec $(obj)u-boot.bin$(obj)System.map $(U_BOOT_NAND) $(U_BOOT_ONENAND)all:$(ALL)这条规则里面并没有命令,所以GNU Make在处理的时候, 会依次去处理ALL中的这五个目标。而针对smdk2410参考板,没有定义CONFIG_NAND_U_BOOT和CONFIG_ONENAND_U_BOOT,所以依据下面的规则,后 面两个目标:$(U_BOOT_NAND) $(U_BOOT_ONENAND) 将为空。ifeq ($(CONFIG_NAND_U_BOOT),y)NAND_SPL = nand_splU_BOOT_NAND = $(obj)u-boot-nand.binendififeq ($(CONFIG_ONENAND_U_BOOT),y)ONENAND_IPL = onenand_iplU_BOOT_ONENAND = $(obj)u-boot-onenand.bin ONENAND_BIN ?= $(obj)onenand_ipl/onenand-ipl-2k.bin endif所以对UBoot的这次编译过程,将会在UBoot顶层目录中 生成三个文件,u-boot.srec、u-boot.bin以及 System.map。其中u-boot.bin正式我们所需要的二进制映 像文件,我们可以把它直接下载到板子的FLASH上用于引 导Linux操作系统。对于第一个文件u-boot.srec,其对应的规则为: $(obj)u-boot.srec:$(obj)u-boot$(OBJCOPY) -O srec $ $(obj)include/autoconf.mk: $(obj)include/config.h$(XECHO) Generating $ ; set -e ; :Extract the config macros ; $(CPP) $(CFLAGS) -DDO_DEPS_ONLY -dMinclude/common.h | sed -n -ftools/scripts/define2mk.sed $.tmp & mv $.tmp $处理autoconf.mk的规则看起来有点繁,但实际上它是以tools/scripts/define2mk.sed 作为 sed 脚本来调用 sed 程 序,其功能是将C语言中定义的宏配置转换成Makefile能 理解的变量定义形式。就smdk2410参考板来说我们可以举个例子:在include/configs/smdk2410.h文件中有宏CONFIG_S3C2410 的定义:#define C0NFIG_S3C2410 1/* specifically aSAMSUNG S3C2410 SoC */ 那么这里的这个命令就会将其转换成如下的形式写到include/autoconfi.mk 文件中去。CONFIG_S3C2410=y最终出来的include/autoconf.mk文件中都是类似的变量 定义。从下面的代码中可以看出这个文件将会被顶层 Makefile所包含进去:# Include autoconf.mk before config.mk so that the config options are available# to all top level build files. We need the dummy all: target to prevent the# dependency target in autoconf.mk.dep from being the default.all:sinclude $(obj)include/autoconf.mk.depsinclude $(obj)include/autoconf.mk那么,include/autoconf.mk.dep又是做什么用的呢?实际 上它内部定义了目标include/autoconf.mk的依赖有哪 些。我们可以列出autoconf.mk.dep的内容如下: include/autoconf.mk: include/common.h /home/yihect/u-boot-2010.06/include/config.h /home/yihect/u-boot-2010.06/include/config_defaults.h /home/yihect/u-boot-2010.06/include/configs/smdk2410.h /home/yihect/u-boot-2010.06/include/config_cmd_defa ult.h /home/yihect/u-boot-2010.06/include/asm/config.h /home/yihect/u-boot-2010.06/include/linux/bitops.h /home/yihect/u-boot-2010.06/include/asm/types.h /home/yihect/u-boot-2010.06/include/asm/bitops.h /home/yihect/u-boot-2010.06/include/asm/proc/system .h /home/yihect/u-boot-2010.06/include/linux/config.h /home/yihect/u-boot-2010.06/include/linux/types.h/home/yihect/u-boot-2010.06/include/linux/posix_types.h /home/yihect/u-boot-2010.06/include/linux/stddef.h /home/yihect/u-boot-2010.06/include/asm/posix_types .h /home/yihect/u-boot-2010.06/include/linux/string.h /home/yihect/u-boot-2010.06/include/asm/string.h /home/yihect/u-boot-2010.06/include/asm/ptrace.h /home/yihect/u-boot-2010.06/include/asm/proc/ptrace .h /home/yihect/eldk/usr/bin/lib/gcc/arm-linux-gnue abi/4.2.2/include/stdarg.h /home/yihect/u-boot-2010.06/include/part.h /home/yihect/u-boot-2010.06/include/ide.h /home/yihect/u-boot-2010.06/include/flash.h /home/yihect/u-boot-2010.06/include/image.h /home/yihect/u-boot-2010.06/include/compiler.h /home/yihect/eldk/usr/bin/./lib/gcc/arm-linux-gnue abi/4.2.2/include/stddef.h /home/yihect/u-boot-2010.06/include/asm/byteorder.h /home/yihect/u-boot-2010.06/include/linux/byteorder/little_endian.h /home/yihect/u-boot-2010.06/include/linux/byteorder/swab.h /home/yihect/u-boot-2010.06/include/linux/byteorder/generic.h /home/yihect/u-boot-2010.06/include/lmb.h /home/yihect/u-boot-2010.06/include/asm/u-boot.h /home/yihect/u-boot-2010.06/include/command.h /home/yihect/u-boot-2010.06/include/asm/global_data.h /home/yihect/u-boot-2010.06/include/asm/mach-types.h /home/yihect/u-boot-2010.06/include/asm/setup.h /home/yihect/u-boot-2010.06/include/asm/u-boot-arm. h /home/yihect/u-boot-2010.06/include/net.h /home/yihect/u-boot-2010.06/include/u-boot/crc.h 这样一个文件就是由上面那条对应autoconf.mk.dep的 规则所生成的。由上面可知,这样一个文件的内容也会被包 含到UBoot顶层Makefile中。讨论到这里,也许您觉得 关于autoconf的这两条规则都没什么要说的了。但是还有 一个问题:那就是 autoconf.mk 和 autoconf.mk.dep 是 如何生成的?因为这两个文件都是被sinclude到顶层 Makefile中去的,而在我们使用Make编译UBoot的时 候此两个文件并不存在,所以按照GNU Make的规范,它 在全部读入顶层Makefile后,需要重新生成做sinclude时 找不到的这两个文件。生成后它又会重新处理顶层 Makefile,并重新包含这两个文件。所以此处(depend规则) 对$(obj)include/autoconf.mk处理时,它要做的只是检查 检查相关的依赖,决定是否需要重新生成autoconf.mk文 件。depend规则中,处理完所有依赖后,GNU Make会循环进 入一些目录去make 一个特定的目标_depend,我们这里 不再详细深入考察这个部分。我觉得唯一需要您注意的是, 对于smdk2410参考板来说,变量LDSCRIPT定义在文件 arch/arm/config.mk 中,如下示:LDSCRIPT := $(SRCTREE)/$(CPUDIR)/u-boot.lds这个变量定义了链接时需要使用到的链接脚本,其内容我们 会在后续的文章中深入分析。另外如下面所示,我们也知道 arch/arm/config.mk也是一个被间接sinclude到顶层 Makefile中的文件,该文件的其他内容比较简单,请读者 自行分析。sinclude $(TOPDIR)/arch/$(ARCH)/config.mk # include architecture dependend rules好了,回到我们对u-boot规则的处理上面来,下一个要处 理的依赖是$(SUBDIRS),我们可找到相关的规则如下: $(SUBDIRS):depend$(MAKE) -C $ all从上面可以看出,它要依赖于depend,这个我们前面已经 处理过了,所以GNU Make要依次进入一系列的目录去 make目标all。这里值得一说的是,它会进入到tools目 录下去编译一些工具,其中最重要的当数mkimage工具。 作为留给读者的练习,请您预先去查找google, 了解它的 用途及用法。接下来,GNU Make下一个要处理的依赖是$(OBJS)。变 量OBJS定义在下面:# U-Boot objects.order is important (i.e. start must be first)OBJS = $(CPUDIR)/start.oifeq ($(CPU),i386)OBJS += $(CPUDIR)/start16.oOBJS += $(CPUDIR)/resetvec.oendififeq ($(CPU),ppc4xx)OBJS += $(CPUDIR)/resetvec.oendififeq ($(CPU),mpc85xx)OBJS += $(CPUDIR)/resetvec.oendifOBJS := $(addprefix $(obj),$(OBJS) 以$(OBJS)为目标的规则可找到如下: $(OBJS):depend$(MAKE) -C $(CPUDIR) $(if $(REMOTE_BUILD),$,$(notdir $)对于smdk2410参考板来说,变量OBJS只定义有一个 对象文件。就是这样一个文件start.o,在后面链接形成 u-boot时将被放在u-boot的最前面。后面会知道,这个文 件里的程序将至关重要。因为系统上电后要执行的第一条指 令将位于这个文件内。下面要处理的依赖是$(LIBBOARD),找到对应的变量定义 以及规则如下:LIBBOARD = board/$(BOARDDIR)/lib$(BOARD).a LIBBOARD := $(addprefix $(obj),$(LIBBOARD)$(LIBBOARD):depend $(LIBS)$(MAKE) -C $(dir $(subst $(obj),$) 其中变量BOARDDIR定义在根目录的config.mk中,如 下所示:ifdef VENDORBOARDDIR = $(VENDOR)/$(BOARD)elseBOARDDIR = $(BOARD)endififdef BOARDsinclude $(TOPDIR)/board/$(BOARDDIR)/config.mk # include board specific rules endif针对smdk2410参考板,BOARDDIR的值计算出来是: samsung/s3c24x0。为什么呢?因为根目录中的 config.mk是被直接包含进顶层Makefile的,在此之前, 顶层Makefile包含include/config.mk的。而通过前面的 讨论,我们知道正是在这个文件定义了ARCH/CPU/BOARD/VENDOR/SOC 等变量的定义,这是 在配置过程中产生的。讨论到这里,读者也许迷惑于UBoot中如此多的*.mk文 件包含。干脆我们把它们列一下是形成下面的图片。其实比 较运气的是,UBoot中的Makefile包含文件,都是以.mk 结尾的,所以我们理起来,也比较方便。i feq (5(obj) ndu de/config.mk,ctard $(obj) ndude /ccnfi g ,m k)# Ind ude ajtoconf.mk before config ,mk so th the config options are available #to all topical build files. We neaj the dummy all: target to prevent the rf dependency target in autoconf.mk.dep from being the defojlt.all:sinducte $(obj)ind ucte/aut ocont,m k .depsinducfe $(obj)ind ucfe/aut oconf m kinclude/config.* Irad .岷CH, g岷。神 CPU conliguration ihrluij。$(obDihrhJd冒corifljmkexfwrt ARCH CPU BO.iRD VENDOR SOC* set default to nothing for ratitq builds if OH OS T 明 CH)飘炽 CH) CROSS-COMPILE ?=endifARZH = am,CFU = ann920t BOARD = smdk2410 VENDOR = Samsung SOC = s3c24k0# load eeneed tea rdsi ncl Tide $ (OBJ TFEE) / inc lud e/aiito con f. mlc* load other configuration include SfTOPDfcQMig.mk根目录下config.nkj# Sane architecture oonfiE.ink fi les need to krow vflat CPUDI5 is set to,# so slculqte CPUDIJi before including ARCH/9X/CPV gnfiu.ink files.# Check if ard/JAFCK/cjflV$2PV ezists other诚se assuine arcl/AFCK/cpu ozxnt&iiis# CPU-speci fie code.CPUDI R=arch/$(AFC W/cpu/(CPU)ifneaXSRCTKEE)州CPUIIRX Xwildc曷d j(SFETEEE)/5(C?UDIB)CPUDI H rch/$(AFE10 / epu endifrulessincl-ude 3 (lOPDIR) A roh/S (JiFElil / osn fi g. mk siiicl-ude (TOPBIlO /i (CPUDI10 / on f i C. mkinclude architecture dep end end rules inc lude CPU spec ifi cif def SCC$ (TOPBIR)/J (CPUDI 10 / 9 (SOC) i e,mk endifif def SENIORKIAEDDIR = 3(VINDOKl/J(3AJD)el seElARDIirR = JCBOAKD)endifif def IOAK)sixtcl-ude 1(TOPIIIR)/bcard/5(EOAFIIIlO/conf ie. mk endifinclude board spec ifi crille erules顶层Makefile包含了根目录下的config.mk,而根目录下 的config.mk则包含了不同板子、不同CPU架构特定的 config.mk,它们都被安排在不同的目录下面。这里需要引 起注意的是,对于smdk2410参考板,在目录 arch/arm/cpu/arm920t/s3c24x0 下面并不存在config.mk,但是这里却将它sinclude进来。这种做法并 不会引发make时的错误,因为其用的是sinclude,而非 include。另外,从LIBBOARD的处理规则上可以看出来, LIBBOARD目标是依赖于LIBS的,所以在处理 LIBBOARD之前,GNU Make会依次编译生成用到的不同 种类的库。只有LIBS处理完成后,GNU Make才会动手 去编译生成LIBBOARDo好,从u-boot对应规则上看,GNU Make要处理的下一 步要做的是处理$(LIBS)目标,但是正因为刚刚提到的 LIBBOARD要依赖于LIBS,所以实际上LIBS先于 LIBBOARD而得到处理,其在Makefile中对应的变量定 义及规则如下:LIBS = lib/libgeneric.aLIBS += lib/lzma/liblzma.aLIBS += lib/lzo/liblzo.aLIBS := $(addprefix $(obj),$(LIBS).PHONY : $(LIBS) $(TIMESTAMP_FILE) $(VERSION_FILE)$(LIBS):depend $(SUBDIRS)$(MAKE) -C $(dir $(subst $(obj),$)它就要进入各个目录中去编译一个个的归档库文件,这没什 么好说的。接下来对u-boot规则要处理的依赖是$(LDSCRIPT),变量 LDSCRIPT 被定义在文件:arch/arm/config.mk 中: LDSCRIPT := $(SRCTREE)/$(CPUDIR)/u-boot.lds而处理$(LDSCRIPT)的规则则被放在顶层Makefile中: $(LDSCRIPT):depend$(MAKE) -C $(dir $) $(notdir $) 正如你所看到的,这条规则会使GNU Make进去到目录 $(SRCTREE)/$(CPUDIR)/ 中去做 make u-boot.lds 的动 作。而针对smdk2410参考板来说,这个目录为 arch/arm/cpu/arm920t/,观察一下,此目录的 Makefile 中 并无u-boot.lds的规则定义,所以这个规则针对 smdk2410参考板来说将不会使GNU Make做任何动作。好,接下来,处理u-boot目标的最后一个依赖是 $(obj)u-boot.lds,在顶层Makefile中查找出对应的规则 定义如下:$(obj)u-boot.lds: $(LDSCRIPT)$(CPP) $(CPPFLAGS) $(LDPPFLAGS) -ansi -D_ASSEMBLY_ -P - $这条规则的意思就是要对arch/arm/cpu/arm920t/目录下 的u-boot.lds文件作预处理,并将结果保存为UBoot根 目录下名叫u-boot.lds的文件中,其内容我们在以后的文 章中再行分析。好,GNU Make处理完u-boot规则的所有依赖后,接下 来要执行该规则对应的命令集来生成u-boot。首当其冲的 是要执行GEN_UBOOT所指代的命令。查找出 GEN_UBOOT变量的定义如下:GEN_UBOOT = UNDEF_SYM=$(OBJDUMP) -x $(LIBBOARD) $(LIBS) | sed -n -es/.*($(SYM_PREFIX)_u_boot_cmd_.*)/-u1/p|sort uniq;cd $(LNDIR) & $(LD) $(LDFLAGS) $UNDEF_SYM $(_OBJS) -start-group $(_LIBS) -end-group $(PLATFORM_LIBS) -Map u-boot.map -o u-boot 由上面的定义可知,这里的命令正是进入到UBoot根目录 中,并使用链接器将前面产生的start.o、各种库链接起来, 构成一个ELF格式的可执行映像u-boot,这可以从编译 UBoot的输出结果的最后一部分中看出来(用省略号代替了 部分内容):UNDEF_SYM=arm-linux-objdump -x board/samsung/smdk2410/libsmdk2410.a;cd /home/yihect/u-boot-2010.06 & arm-linux-ld -Bstatic -T u-boot.lds -Ttext 0x33F80000$UNDEF_SYM arch/arm/cpu/arm920t/start.o -start-group lib/libgeneric.a board/samsung/smdk2410/libsmdk2410.a-end-group/home/yihect/u-boot-2010.06/arch/arm/lib/eabi_compa t.o-L/home/yihect/eldk/usr/bin/./lib/gcc/arm-linux-gnue abi/4.2.2/soft-float -lgcc -Map u-boot.map -o u-bootarm-linux-objcopy -O srec u-boot u-boot.srecarm-linux-objcopy -gap-fill=0xff -O binary u-boot u-boot.bin有了 u-boot这个ELF映像后,从上面输出结果的最后两 行可以看出来,GNU Make将会用arm-linux-objcopy工 具将srec格式映像文件转换出来;对于u-boot.bin也以 类似的方式用objcopy转出来,这个文件里面包含了纯粹 的二进制指令和数据,没有使用任何的格式进行封装。这个 正是smdk2410参考板所需要的,开发者会将这个文件下载 到板子的FLASH里面来引导操作系统。总结一下:对于要使用UBoot的用户来说,UBoot的配置 编译时非常简单的,只需要两个命令的调用就好。但是正如 你所见,其台面下的动作还是非常之多,要了解规模不算大 也不算小的这样一个工程还是得花费一些时间的。当然,我 们讲正是一份汗水、一份收获。等到你要动手移植UBoot 的时候,就会懂得这份汗水的珍贵。另外,如果您想分析 Linux内核代码的配置编译过程,不乏以UBoot工程代码 作为开始和练习的机会。分享到:上一篇:嵌入式系统Boot Loader启动全过程详解下一篇:uboot移植全过程-基于ARM9 2410
展开阅读全文
相关资源
相关搜索

最新文档


当前位置:首页 > 图纸设计 > 毕设全套


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!