6410uboot1.1.6配置、编译、链接分析Word下载.docx
《6410uboot1.1.6配置、编译、链接分析Word下载.docx》由会员分享,可在线阅读,更多相关《6410uboot1.1.6配置、编译、链接分析Word下载.docx(18页珍藏版)》请在冰豆网上搜索。
Fs:
支持文件系统的文件,u-boot现在支持cramfs、fat、fdos、jffs2、yaffs和registerfs。
Include:
头文件,还有对各种硬件平台支持的会变文件,系统的配置文件和对文件系统支持的文件。
Lib_arm:
存放对ARM体系结构通用的文件,主要用于实现ARM平台通用的函数,与ARM体系结构相关的代码。
Lib_*:
某一架构通用的文件。
Lib_generic:
通用的多功能函数实现。
Nand_spl:
Uboot一般从ROM、NORFlash等设备启动,现在开始执行NANDFlash启动,但是支持的CPU种类还不多。
Net:
与网络有关的代码,BOOTP协议、TFTP协议RARP协议和NFS文件系统的实现。
Post:
上电自检程序。
Rtc:
实时时钟驱动。
Tools:
创建S-Record格式文件和U-BOOTimages的工具。
1.2编译程序
进入源码目录执行:
makedistclean--清除所有生成的文件
makeNAME_config--根据自己使用的开发板进行配置
makeall--编译源码
2、uboot的配置过程
从README文件中我们知道了makeNAME_config是用来对自己的开发板进行配置的,那就先来看下到底是怎么配置的。
这边假设我们的板子是smdk6410,那么应该在源码目录执行makesmdk6410_config
make调用的是顶层目录下的Makefile文件,我们传参数是smdk6410_config,
所以在Makefile中找到smdk6410_config的相应部分如下:
smdk6410_config:
unconfig
@$(MKCONFIG)$(@:
_config=)arms3c64xxsmdk6410samsungs3c6410
先分析下这条规则:
smdk6410_config:
规则的目标名
unconfig:
规则的依赖,这个在Makefile文件的342行可以找到,如下:
unconfig:
@rm-f$(obj)include/config.h$(obj)include/config.mk\
$(obj)board/*/config.tmp$(obj)board/*/*/config.tmp
这个就不在分析,就是删除一些文件。
第二行开头的@:
表示该行命令的输出被抑制,即执行的时候不会在终端上打印出来。
$(MKCONFIG):
MKCONFIG这个变量在92行定义MKCONFIG:
=$(SRCTREE)/mkconfig,而变量SRCTREE在87行定义SRCTREE:
=$(CURDIR),而CURDIR是Makefile自带的变量表示当前目录,所以$(MKCONFIG)就是当前目录下的mkconfig文件,即顶层目录下的mkconfig文件。
$(@:
_config=):
$@是make的自动变量,标识规则的目标名,即smdk6410_config。
_config=)意思就是$@中的“_config”替换为空,也就是删掉目标中“_config”这个子串。
所以这边$(@:
_config=)为smdk6410。
这样看的话在配置时,执行makesmdk6410_config实际上执行的是:
./mkconfigsmdk6410arms3c64xxsmdk6410samsungs3c6410
到这才真正地开始配置开发板,接下来带着这条命令详细分析下mkconfig这个文件。
1#!
/bin/sh-e
//选项-e表示一个命令在执行后返回一个非0状态值时,就退出
2
3#Scripttocreateheaderfilesandlinkstoconfigure
4#U-Bootforaspecificboard.
5#
6#Parameters:
TargetArchitectureCPUBoard[VENDOR][SOC]
7#
8#(C)2002-2006DENXSoftwareEngineering,WolfgangDenk<
wd@denx.de>
9#
10
11APPEND=no#Default:
Createnewconfigfile
//APPEND=no这边表示重新创建一个文件,APPEND=yes表示将内容追加到原来的文件中
12BOARD_NAME="
"
#Nametoprintinmakeoutput
//BOARD_NAME为开发板的名字
13
14while[$#-gt0];
do
15case"
$1"
in
16--)shift;
break;
;
17-a)shift;
APPEND=yes;
18-n)shift;
BOARD_NAME="
${1%%_config}"
;
shift;
19*)break;
20esac
21done
//"
$#"
将扩展成传递给脚本的参数的数目
$*"
将扩展成传递给脚本的所有参数
shift"
将$*中的剩余的参数向左移动一个位置并减少$#的值1
//14-21行判断“./mkconfigsmdk6410arms3c64xxsmdk6410samsungs3c6410”命令中是否有“--”,“-a”,“-n”等符号,
//这边没有,所以不做任何事情,11行和12行的变量仍然维持原来的值。
22
23["
${BOARD_NAME}"
]||BOARD_NAME="
//先判断BOARD_NAME是否为空,为空将命令中的第一个参数smdk6410赋值给BOARD_NAME,即这边BOARD_NAME为“smdk6410”
24
25[$#-lt4]&
&
exit1
26[$#-gt6]&
表示参数的个数,如果参数个数小于4或者大于6就退出,这边$#=6,所以可以继续往下执行。
27
28echo"
Configuringfor${BOARD_NAME}board..."
//打印出开发板的名字
29
30#
31#Createlinktoarchitecturespecificheaders
//创建体系结构相关的头文件链接
32#
33if["
$SRCTREE"
!
="
$OBJTREE"
];
then
34mkdir-p${OBJTREE}/include
35mkdir-p${OBJTREE}/include2
36cd${OBJTREE}/include2
37rm-fasm
38ln-s${SRCTREE}/include/asm-$2asm
39LNPREFIX="
../../include2/asm/"
40cd../include
41rm-rfasm-$2
42rm-fasm
43mkdirasm-$2
44ln-sasm-$2asm
45else
46cd./include
47rm-fasm
48ln-sasm-$2asm
49fi
//33行判断源码目录SRCTREE和目标文件目录SRCTREE是否一样,SRCTREE和SRCTREE在顶层Makefile中定义,
//这边要判断,是因为可以选择在其他目录下编译u-boot的源码,这样可以令源代码目录保存干净,这时SRCTREE和SRCTREE的值就不一样了
//不过我们一般都习惯直接就在源码目录下编译的,所以SRCTREE和OBJTREE都为当前目录,
//那么33行条件不成立,将执行else分支的代码。
//46-48行进入include目录,删除asm文件(这是上一次配置时建立的链接文件),
//然后再次建立asm文件,并令它链接向asm-$2目录,即asm-arm($2表示第二个参数arm)
50
51rm-fasm-$2/arch
//删除asm-$2/arch目录,即删除asm-arm/arch
52
53if[-z"
$6"
-o"
="
NULL"
54ln-s${LNPREFIX}arch-$3asm-$2/arch
55else
56ln-s${LNPREFIX}arch-$6asm-$2/arch
57fi
//$6表示第6个参数s3c6410,不为空,也不为“NULL”,53行条件不满足,将执行else分支
//其中LNPREFIX为空,$6表示第6个参数s3c6410,$2表示第2个参数arm
//所以“ln-s${LNPREFIX}arch-$6asm-$2/arch”即ln-sarch-s3c6410asm-arm/arch
//前面有进入include目录,这时还在include目录下,
//所以意思是在asm-arm下创建符号链接arch指向arch-s3c6410
58
59#createlinkfors3c24xxSoC
60if["
$3"
s3c24xx"
61rm-fregs.h
62ln-s$6.hregs.h
63rm-fasm-$2/arch
64ln-sarch-$3asm-$2/arch
65fi
66
67#createlinkfors3c64xxSoC
68if["
s3c64xx"
69rm-fregs.h
70ln-s$6.hregs.h
71rm-fasm-$2/arch
72ln-sarch-$3asm-$2/arch
73fi
//$3表示第三个参数s3c64xx,所以满足68行的if语句,注意的是,这时还在include目录下操作
//删除regs.h文件,$6表示第6个参数s3c6410,所以“ln-s$6.hregs.h”表示“ln-ss3c6410.hregs.h”
//$2表示第2个参数arm,$3表示第三个参数s3c64xx,所以后面两句分别是
//rm