ARM入门笔记——Uboot分析(1)
本帖最后由 Garbage614 于 2012-7-17 17:37 编辑主机平台:VM+ubuntu10.04
编译软件:arm-linux-gcc 3.4.5
辅助软件:SecureCRT+Filezilla+notepad+SourceInsight
本来想用新版的uboot2012.04,结果试着编译了一下,出现很多错误,懒的去解决了,反正uboot整个编译机制类似,所以选用一次编译通过的1.1.6版本
默认配置命令:make smdk2410_config
首选从顶层Makefile开始分析#版本号
VERSION = 1
PATCHLEVEL = 1
SUBLEVEL = 6
EXTRAVERSION =
U_BOOT_VERSION = $(VERSION).$(PATCHLEVEL).$(SUBLEVEL)$(EXTRAVERSION)
VERSION_FILE = $(obj)include/version_autogenerated.h
#主机ARCH
HOSTARCH := $(shell uname -m | \ #shell脚本,uname标准输出,-m显示硬件运行的机器ID
sed -e s/i.86/i386/ \
-e s/sun4u/sparc64/ \
-e s/arm.*/arm/ \
-e s/sa110/arm/ \
-e s/powerpc/ppc/ \
-e s/macppc/ppc/)
#sed命令,用后边的替换前边的,-e表示对每一行都执行
#主机OS
HOSTOS := $(shell uname -s | tr '[:upper:]' '[:lower:]' | \ #-s显示使用的系统
sed -e 's/\(cygwin\).*/cygwin/')
#大写换成小写
export HOSTARCH HOSTOS #声明可以传递到下级Makefile
# Deal with colliding definitions from tcsh etc.
VENDOR=
#设定编译输出路径,默认不定义BUILD_DIR,即BUILD_DIR =""
ifdef O
ifeq ("$(origin O)", "command line")
#origin函数可得到变量的来源,如果变量在命令行定义过则返回"command line"
#默认不定义,所以BUILD_DIR := $(O)不执行
BUILD_DIR := $(O)
endif
endif
ifneq ($(BUILD_DIR),)
#相等,返回0,saved-output := $(BUILD_DIR)不执行
saved-output := $(BUILD_DIR)
# Attempt to create a output directory.
$(shell [ -d ${BUILD_DIR} ] || mkdir -p ${BUILD_DIR})
#shell 测试命令 -d(如果存在并且是目录)||mkdir -p(创建目录,可以没有父目录)
#如果不存在${BUILD_DIR}则建立该目录
# Verify if it was successful.
BUILD_DIR := $(shell cd $(BUILD_DIR) && /bin/pwd) #跳转到输出目录并打印路径,并把路径赋给BUILD_DIR
$(if $(BUILD_DIR),,$(error output directory "$(saved-output)" does not exist))
#if函数:$(if <condition>,<then-part>,<else-part>)
#检查$(BUILD_DIR)目录是否存在
endif # ifneq ($(BUILD_DIR),)
OBJTREE := $(if $(BUILD_DIR),$(BUILD_DIR),$(CURDIR))
#如果BUILD_DIR存在,OBJTREE为BUILD_DIR,否则为CURDIR(make当前目录),也就是Uboot顶层目录
SRCTREE := $(CURDIR) #顶层目录
TOPDIR := $(SRCTREE) #顶层目录
LNDIR := $(OBJTREE) #顶层目录
export TOPDIR SRCTREE OBJTREE
MKCONFIG := $(SRCTREE)/mkconfig #顶层目录下的mkconfig
export MKCONFIG
ifneq ($(OBJTREE),$(SRCTREE)) #相同,不执行endif前的代码
REMOTE_BUILD := 1
export REMOTE_BUILD
endif
# $(obj) and (src) are defined in config.mk but here in main Makefile
# we also need them before config.mk is included which is the case for
# some targets like unconfig, clean, clobber, distclean, etc.
ifneq ($(OBJTREE),$(SRCTREE)) #相同,执行else
obj := $(OBJTREE)/
src := $(SRCTREE)/
else
obj :=
src :=
endif
export obj src
#########################################################################
ifeq ($(OBJTREE)/include/config.mk,$(wildcard $(OBJTREE)/include/config.mk))
#$(wildcard $(obj)include/config.mk)执行结果是“$(obj)include/config.mk”展开的字符串,或为空
#在没有make smdk2410_config前没有产生config.mk,所以ifeq以后的代码不执行现在查看下配置命令smdk2410_config
/Makefilesmdk2410_config : unconfig
#依赖于unconfig
@$(MKCONFIG) $(@:_config=) arm arm920t smdk2410 NULL s3c24x0
#等价于 ./mkconfig smdk2410 arm arm920t smdk2410 NULL s3c24x0,执行顶层目录下的mkconfig
#$(@:_config=)替换引用规则,标准格式是,$(var:a=b) 或 ${var:a=b},把变量var中的每一个值结尾用b替换掉a在查看下unconfig
/Makefileunconfig: #配置前要做的工作,清除上次产生的配置文件
@rm -f $(obj)include/config.h $(obj)include/config.mk \
$(obj)board/*/config.tmp $(obj)board/*/*/config.tmp查看下顶层mkconfig
/mkconfig#!/bin/sh -e
# Script to create header files and links to configure
# U-Boot for a specific board.
#
# Parameters:TargetArchitectureCPUBoard
# smdk2410 arm arm920t smdk2410 NULL s3c24x0
#
# (C) 2002-2006 DENX Software Engineering, Wolfgang Denk <wd@denx.de>
#
APPEND=no # Default: Create new config file
BOARD_NAME="" # Name to print in make output
#-eq(等于)-ne(不等于)-lt(小于)-le(小于等于)-gt(大于)-ge(大于等于)
while [ $# -gt 0 ] ; do #[参数总数>0])
case "$1" in
--) shift ; break ;; #shift 左移
-a) shift ; APPEND=yes ;;
-n) shift ; BOARD_NAME="${1%%_config}" ; shift ;;
*)break ;;
esac
done
#检查参数中是不是有-- -a -n -t *,没有,所以while循环不起作用
[ "${BOARD_NAME}" ] || BOARD_NAME="$1"
#||相当于 if not……then……
#[]内表示测试
#将${BOARD_NAME}设置为第一个参数,即smdk2410
[ $# -lt 4 ] && exit 1
[ $# -gt 6 ] && exit 1
#参数小于4或大于6,错误,退出程序
echo "Configuring for ${BOARD_NAME} board..."
#打印信息
#
# Create link to architecture specific headers
#
#Makefile中设置"$SRCTREE" = "$OBJTREE",所以执行else
if [ "$SRCTREE" != "$OBJTREE" ] ; then
mkdir -p ${OBJTREE}/include
mkdir -p ${OBJTREE}/include2
cd ${OBJTREE}/include2
rm -f asm
ln -s ${SRCTREE}/include/asm-$2 asm
LNPREFIX="../../include2/asm/"
cd ../include
rm -rf asm-$2
rm -f asm
mkdir asm-$2
ln -s asm-$2 asm
else
cd ./include
#转到include目录下
rm -f asm
ln -s asm-$2 asm #ln -s asm-arm asm
#建立asm-arm目录的符号(-s)链接asm
fi
rm -f asm-$2/arch
if [ -z "$6" -o "$6" = "NULL" ] ; then
#-z如果STRING的长度为零则为真
#-o逻辑或
ln -s ${LNPREFIX}arch-$3 asm-$2/arch
else
ln -s ${LNPREFIX}arch-$6 asm-$2/arch
fi
#如果参数6(soc)为空,则建立符号连接asm-$2/arch链接到include/asm-arm/arch-$2
#否则就使其链接到include/asm-arm/arch-$6
#include/asm-arm/arch-arm920t不存在,因此$6不能为空
if [ "$2" = "arm" ] ; then
rm -f asm-$2/proc
ln -s ${LNPREFIX}proc-armv asm-$2/proc
fi
#若参数2(Arch)是arm,则建立符号连接include/asm-arm/proc链接到目录proc-armv
#
# Create include file for Make
#
#上边cd到include目录,所以建立config.mk也在该目录
echo "ARCH = $2" >config.mk #新建文件并写入
echo "CPU = $3" >> config.mk #写入内容
echo "BOARD= $4" >> config.mk
#
[ "$5" ] && [ "$5" != "NULL" ] && echo "VENDOR = $5" >> config.mk
[ "$6" ] && [ "$6" != "NULL" ] && echo "SOC = $6" >> config.mk
#参数5、参数6如果不为空写入config.mk
#
# Create board specific header file
#
#默认APPEND=no,执行else
if [ "$APPEND" = "yes" ] # Append to existing config file
then
echo >> config.h
else
> config.h # Create new config file
fi
echo "/* Automatically generated - do not edit */" >>config.h
echo "#include <configs/$1.h>" >>config.h
#创建config.h,并写入两行内容
exit 0
#——————————————————>转到顶层makefile中\
#ifeq ($(OBJTREE)/include/config.mk,$(wildcard $(OBJTREE)/include/config.mk))mkconfig 主要做了一下几个工作:
1)建立cpu、arch和开发板相关头文件的链接文件
ln-sasm-$2asm
ln-sarch-$6asm-$2/arch
ln-sproc-armvasm-$2/proc
2)创建include/config.mk
ARCH = $2
CPU = $3
BOARD= $4
VENDOR = $5
SOC = $6
3)创建开发板相关头文件include/config.h
#include <configs/$1.h> 本帖最后由 Garbage614 于 2012-7-17 17:36 编辑
在回到/Makefile#########################################################################
ifeq ($(OBJTREE)/include/config.mk,$(wildcard $(OBJTREE)/include/config.mk))
# load ARCH, BOARD, and CPU configuration
include $(OBJTREE)/include/config.mk
export ARCH CPU BOARD VENDOR SOC
#指定交叉编译工具
ifndef CROSS_COMPILE
ifeq ($(HOSTARCH),ppc)
CROSS_COMPILE =
else
ifeq ($(ARCH),ppc)
CROSS_COMPILE = powerpc-linux-
endif
ifeq ($(ARCH),arm)
CROSS_COMPILE = arm-linux- #选定
endif
ifeq ($(ARCH),i386)
ifeq ($(HOSTARCH),i386)
CROSS_COMPILE =
else
CROSS_COMPILE = i386-linux-
endif
endif
ifeq ($(ARCH),mips)
CROSS_COMPILE = mips_4KC-
endif
ifeq ($(ARCH),nios)
CROSS_COMPILE = nios-elf-
endif
ifeq ($(ARCH),nios2)
CROSS_COMPILE = nios2-elf-
endif
ifeq ($(ARCH),m68k)
CROSS_COMPILE = m68k-elf-
endif
ifeq ($(ARCH),microblaze)
CROSS_COMPILE = mb-
endif
ifeq ($(ARCH),blackfin)
CROSS_COMPILE = bfin-elf-
endif
ifeq ($(ARCH),avr32)
CROSS_COMPILE = avr32-
endif
endif
endif
export CROSS_COMPILE
#include顶层目录config.mk,该文件包含了对编译的一些设置
# load other configuration
include $(TOPDIR)/config.mk
#——————————————————————————>转到顶层config.mk 本帖最后由 Garbage614 于 2012-7-17 18:31 编辑
/config.mk#########################################################################
ifneq ($(OBJTREE),$(SRCTREE)) #相同,执行第二个else
ifeq ($(CURDIR),$(SRCTREE))
dir :=
else
dir := $(subst $(SRCTREE)/,,$(CURDIR))
#dir := /
#$(subst <from>,<to>,<text>)
#名称:字符串替换函数——subst。
#功能:把字串<text>中的<from>字符串替换成<to>。
#返回:函数返回被替换过后的字符串。
endif
obj := $(if $(dir),$(OBJTREE)/$(dir)/,$(OBJTREE)/)
src := $(if $(dir),$(SRCTREE)/$(dir)/,$(SRCTREE)/)
$(shell mkdir -p $(obj))
else
obj :=
src :=
endif
#目标输出到源代码目录下,因此执行完上面的代码后,src和obj都是空
# clean the slate ...
#设置编译选项,后边会添加
PLATFORM_RELFLAGS =
PLATFORM_CPPFLAGS =
PLATFORM_LDFLAGS =
#
# When cross-compiling on NetBSD, we have to define __PPC__ or else we
# will pick up a va_list declaration that is incompatible with the
# actual argument lists emitted by the compiler.
#
#
ifeq ($(ARCH),ppc)
ifeq ($(CROSS_COMPILE),powerpc-netbsd-)
PLATFORM_CPPFLAGS+= -D__PPC__
endif
ifeq ($(CROSS_COMPILE),powerpc-openbsd-)
PLATFORM_CPPFLAGS+= -D__PPC__
endif
endif
ifeq ($(ARCH),arm)
ifeq ($(CROSS_COMPILE),powerpc-netbsd-)
PLATFORM_CPPFLAGS+= -D__ARM__
endif
ifeq ($(CROSS_COMPILE),powerpc-openbsd-)
PLATFORM_CPPFLAGS+= -D__ARM__
endif
endif
ifeq ($(ARCH),blackfin)
PLATFORM_CPPFLAGS+= -D__BLACKFIN__ -mno-underscore
endif
#不满足条件 PLATFORM_CPPFLAGS =
#include开发板相关配置文件
ifdef ARCH
sinclude $(TOPDIR)/$(ARCH)_config.mk # include architecture dependend rules
#/arm_config.mk,设置构架相关的编译选项。
#只有一行:PLATFORM_CPPFLAGS += -DCONFIG_ARM -D__ARM__
#sinclude 无论include过程中出现什么错误,都不要报错继续执行
endif
ifdef CPU
sinclude $(TOPDIR)/cpu/$(CPU)/config.mk # includeCPU specific rules
#cpu/arm920t/config.mk,设置处理器(arm920t)相关的编译选项。
endif
ifdef SOC
sinclude $(TOPDIR)/cpu/$(CPU)/$(SOC)/config.mk # includeSoC specific rules
#cpu/arm920t/s3c24x0/config.mk,该文件不存在
endif
ifdef VENDOR #VENDOR为空,执行else
BOARDDIR = $(VENDOR)/$(BOARD)
else
BOARDDIR = $(BOARD)
#BOARDDIR = smdk2410
endif
ifdef BOARD
sinclude $(TOPDIR)/board/$(BOARDDIR)/config.mk # include board specific rules
#board/smdk2410/config.mk,
#只有一行:TEXT_BASE = 0x33F80000,指定代码段起始地址
endif
#########################################################################
#shell
CONFIG_SHELL := $(shell if [ -x "$$BASH" ]; then echo $$BASH; \
else if [ -x /bin/bash ]; then echo /bin/bash; \
else echo sh; fi ; fi)
ifeq ($(HOSTOS)-$(HOSTARCH),darwin-ppc)
HOSTCC = cc
else
HOSTCC = gcc
#主机编译器
endif
HOSTCFLAGS = -Wall -Wstrict-prototypes -O2 -fomit-frame-pointer
HOSTSTRIP = strip
#主机编译选项
#########################################################################
#
# Option checker (courtesy linux kernel) to ensure
# only supported compiler options are used
#
cc-option = $(shell if $(CC) $(CFLAGS) $(1) -S -o /dev/null -xc /dev/null \
> /dev/null 2>&1; then echo "$(1)"; else echo "$(2)"; fi ;)
#cc-option用于检查编译器CC是否支持某选项。将2个选项作为参数传递给cc-option函数
#该函数调用CC编译器检查参数1是否支持,若支持则函数返回参数1,否则返回参数2
#因此CC编译器必须支持参数1或参数2,若两个都不支持则会编译出错
#
# Include the make variables (CC, etc...)
#
AS = $(CROSS_COMPILE)as
LD = $(CROSS_COMPILE)ld
CC = $(CROSS_COMPILE)gcc
CPP = $(CC) -E
AR = $(CROSS_COMPILE)ar
NM = $(CROSS_COMPILE)nm
STRIP = $(CROSS_COMPILE)strip
OBJCOPY = $(CROSS_COMPILE)objcopy
OBJDUMP = $(CROSS_COMPILE)objdump
RANLIB = $(CROSS_COMPILE)RANLIB
#指定交叉编译链接工具,$(CROSS_COMPILE)在Makefile定义为arm-linux
ifneq (,$(findstring s,$(MAKEFLAGS)))
#如果能从$(MAKEFLAGS)中找到字符s
ARFLAGS = cr
else
ARFLAGS = crv
endif
RELFLAGS= $(PLATFORM_RELFLAGS)
DBGFLAGS= -g # -DDEBUG
OPTFLAGS= -Os #-fomit-frame-pointer
ifndef LDSCRIPT
#LDSCRIPT := $(TOPDIR)/board/$(BOARDDIR)/u-boot.lds.debug
#定义链接文件
ifeq ($(CONFIG_NAND_U_BOOT),y)
LDSCRIPT := $(TOPDIR)/board/$(BOARDDIR)/u-boot-nand.lds
else
LDSCRIPT := $(TOPDIR)/board/$(BOARDDIR)/u-boot.lds
endif
endif
#编译、链接、调试等选项
OBJCFLAGS += --gap-fill=0xff
gccincdir := $(shell $(CC) -print-file-name=include)
CPPFLAGS := $(DBGFLAGS) $(OPTFLAGS) $(RELFLAGS) \
-D__KERNEL__ -DTEXT_BASE=$(TEXT_BASE) \
ifneq ($(OBJTREE),$(SRCTREE))
CPPFLAGS += -I$(OBJTREE)/include2 -I$(OBJTREE)/include
endif
CPPFLAGS += -I$(TOPDIR)/include
CPPFLAGS += -fno-builtin -ffreestanding -nostdinc \
-isystem $(gccincdir) -pipe $(PLATFORM_CPPFLAGS)
ifdef BUILD_TAG
CFLAGS := $(CPPFLAGS) -Wall -Wstrict-prototypes \
-DBUILD_TAG='"$(BUILD_TAG)"'
else
CFLAGS := $(CPPFLAGS) -Wall -Wstrict-prototypes
endif
# avoid trigraph warnings while parsing pci.h (produced by NIOS gcc-2.9)
# this option have to be placed behind -Wall -- that's why it is here
ifeq ($(ARCH),nios)
ifeq ($(findstring 2.9,$(shell $(CC) --version)),2.9)
CFLAGS := $(CPPFLAGS) -Wall -Wno-trigraphs
endif
endif
# $(CPPFLAGS) sets -g, which causes gcc to pass a suitable -g<format>
# option to the assembler.
AFLAGS_DEBUG :=
# turn jbsr into jsr for m68k
ifeq ($(ARCH),m68k)
ifeq ($(findstring 3.4,$(shell $(CC) --version)),3.4)
AFLAGS_DEBUG := -Wa,-gstabs,-S
endif
endif
AFLAGS := $(AFLAGS_DEBUG) -D__ASSEMBLY__ $(CPPFLAGS)
LDFLAGS += -Bstatic -T $(LDSCRIPT) -Ttext $(TEXT_BASE) $(PLATFORM_LDFLAGS)
# Location of a usable BFD library, where we define "usable" as
# "built for ${HOST}, supports ${TARGET}".Sensible values are
# - When cross-compiling: the root of the cross-environment
# - Linux/ppc (native): /usr
# - NetBSD/ppc (native): you lose ... (must extract these from the
# binutils build directory, plus the native and U-Boot include
# files don't like each other)
#
# So far, this is used only by tools/gdb/Makefile.
ifeq ($(HOSTOS)-$(HOSTARCH),darwin-ppc)
BFD_ROOT_DIR = /usr/local/tools
else
ifeq ($(HOSTARCH),$(ARCH))
# native
BFD_ROOT_DIR = /usr
else
#BFD_ROOT_DIR = /LinuxPPC/CDK # Linux/i386
#BFD_ROOT_DIR = /usr/pkg/cross # NetBSD/i386
BFD_ROOT_DIR = /opt/powerpc
endif
endif
ifeq ($(PCI_CLOCK),PCI_66M)
CFLAGS := $(CFLAGS) -DPCI_66M
endif
#########################################################################
export CONFIG_SHELL HPATH HOSTCC HOSTCFLAGS CROSS_COMPILE \
AS LD CC CPP AR NM STRIP OBJCOPY OBJDUMP \
MAKE
export TEXT_BASE PLATFORM_CPPFLAGS PLATFORM_RELFLAGS CPPFLAGS CFLAGS AFLAGS
#########################################################################
#定义编译规则
ifndef REMOTE_BUILD
%.s: %.S
$(CPP) $(AFLAGS) -o $@ $<
%.o: %.S
$(CC) $(AFLAGS) -c -o $@ $<
%.o: %.c
$(CC) $(CFLAGS) -c -o $@ $<
else
$(obj)%.s: %.S
$(CPP) $(AFLAGS) -o $@ $<
$(obj)%.o: %.S
$(CC) $(AFLAGS) -c -o $@ $<
$(obj)%.o: %.c
$(CC) $(CFLAGS) -c -o $@ $<
endif
#########################################################################
#——————————————————>转到顶层makefile中\
## U-Boot objects....order is important (i.e. start must be first)
1)定义了交叉编译、链接等工具
2)定义了编译、优化、链接等选项,其中包括链接脚本LDSCRIPT := $(TOPDIR)/board/$(BOARDDIR)/u-boot.lds,代码段起始地址TEXT_BASE = 0x33F80000
3)定义了编译规则
附:uboot存储使用图
本帖最后由 Garbage614 于 2012-7-17 17:34 编辑
在转到Makefile# U-Boot objects....order is important (i.e. start must be first)
OBJS= cpu/$(CPU)/start.o #U-boot程序入口点
ifeq ($(CPU),i386)
OBJS += cpu/$(CPU)/start16.o
OBJS += cpu/$(CPU)/reset.o
endif
ifeq ($(CPU),ppc4xx)
OBJS += cpu/$(CPU)/resetvec.o
endif
ifeq ($(CPU),mpc83xx)
OBJS += cpu/$(CPU)/resetvec.o
endif
ifeq ($(CPU),mpc85xx)
OBJS += cpu/$(CPU)/resetvec.o
endif
ifeq ($(CPU),mpc86xx)
OBJS += cpu/$(CPU)/resetvec.o
endif
ifeq ($(CPU),bf533)
OBJS += cpu/$(CPU)/start1.o cpu/$(CPU)/interrupt.o cpu/$(CPU)/cache.o
OBJS += cpu/$(CPU)/cplbhdlr.o cpu/$(CPU)/cplbmgr.o cpu/$(CPU)/flush.o
#cpu = arm920t 上边条件都不满足
endif
OBJS := $(addprefix $(obj),$(OBJS))
#$(addprefix <prefix>,<names...>)
#名称:加前缀函数——addprefix。
#功能:把前缀<prefix>加到<names>中的每个单词后面。
#返回:返回加过前缀的文件名序列。
#oobj = 所以OBJS= cpu/$(CPU)/start.o
LIBS= lib_generic/libgeneric.a
LIBS += board/$(BOARDDIR)/lib$(BOARD).a #+= 给变量追加值
LIBS += cpu/$(CPU)/lib$(CPU).a
ifdef SOC
LIBS += cpu/$(CPU)/$(SOC)/lib$(SOC).a
endif
LIBS += lib_$(ARCH)/lib$(ARCH).a
LIBS += fs/cramfs/libcramfs.a fs/fat/libfat.a fs/fdos/libfdos.a fs/jffs2/libjffs2.a \
fs/reiserfs/libreiserfs.a fs/ext2/libext2fs.a
LIBS += net/libnet.a
LIBS += disk/libdisk.a
LIBS += rtc/librtc.a
LIBS += dtt/libdtt.a
LIBS += drivers/libdrivers.a
LIBS += drivers/nand/libnand.a
LIBS += drivers/nand_legacy/libnand_legacy.a
LIBS += drivers/sk98lin/libsk98lin.a
LIBS += post/libpost.a post/cpu/libcpu.a
LIBS += common/libcommon.a
LIBS += $(BOARDLIBS)
LIBS := $(addprefix $(obj),$(LIBS))
LIBS += drivers/nand/libnand.a
LIBS += drivers/nand_legacy/libnand_legacy.a
LIBS += drivers/sk98lin/libsk98lin.a
LIBS += post/libpost.a post/cpu/libcpu.a
LIBS += common/libcommon.a
#LIBS变量表示了U-Boot需要的所有库文件,每个库都通过相应的子目录编译得到的。
#cpu/$(CPU)/start.o
#board/$(VENDOR)/common/lib$(VENDOR).a
#cpu/$(CPU)/lib$(CPU).a
#cpu/$(CPU)/$(SOC)/lib$(SOC).a
#lib_$(ARCH)/lib$(ARCH).a
#以上是和平台有关的。
.PHONY : $(LIBS)
# Add GCC lib
PLATFORM_LIBS += -L $(shell dirname `$(CC) $(CFLAGS) -print-libgcc-file-name`) -lgcc
# The "tools" are needed early, so put this first
# Don't include stuff already done in $(LIBS)
SUBDIRS = tools \
examples \
post \
post/cpu
.PHONY : $(SUBDIRS)
#不明白
ifeq ($(CONFIG_NAND_U_BOOT),y)
NAND_SPL = nand_spl
U_BOOT_NAND = $(obj)u-boot-nand.bin
endif
#有的开发板定义了nand启动,但对于S3C24x0,uboot源代码不支持
__OBJS := $(subst $(obj),,$(OBJS))
__LIBS := $(subst $(obj),,$(LIBS))
#$(subst <from>,<to>,<text>)
#名称:字符串替换函数——subst。
#功能:把字串<text>中的<from>字符串替换成<to>。
#返回:函数返回被替换过后的字符串。
#########################################################################
以上是make的内容,链接所有相关的库和.o文件,生成u-boot.srecu-boot.binSystem.map等文件(ALL = $(obj)u-boot.srec $(obj)u-boot.bin $(obj)System.map $(U_BOOT_NAND))
System.map表示的是地址标号到该标号表示的地址的一个映射关系。System.map每一行的格式都是“addr type name”,addr是标号对应的地址值,name是标号名,type表示标号的类型。 好文!收藏了,我一直在捣腾2010的一个版本,有问题以后向楼主请教哦! 顶起,好东西的捏。。。。 無智 发表于 2012-7-18 01:21 static/image/common/back.gif
好文!收藏了,我一直在捣腾2010的一个版本,有问题以后向楼主请教哦!
共同交流~~我大概看了一下,2011和这个版本大体上还差不多,当然后边的还有待深入研究 mark{:smile:} mark{:smile:}{:smile:} ARMr ip学习笔记,顶UBOOT啊。 谢谢楼主啦 。 Garbage614 发表于 2012-7-17 16:48 static/image/common/back.gif
在转到Makefile以上是make的内容,链接所有相关的库和.o文件,生成u-boot.srecu-boot.binSystem.map等 ...
看起来比较明了易懂
好东东 mark!!!!{:smile:} Garbage614 发表于 2012-7-18 01:37 static/image/common/back.gif
共同交流~~我大概看了一下,2011和这个版本大体上还差不多,当然后边的还有待深入研究 ...
安装ubuntu哪个版本好?我安装的是12.04,还没开始学... fshunj 发表于 2012-9-10 16:49 static/image/common/back.gif
安装ubuntu哪个版本好?我安装的是12.04,还没开始学...
无所谓,反正都是ssh登录的,不过高版本的内核是3.0的 可能在学习的时候会带来不便 Garbage614 发表于 2012-9-10 22:18 static/image/common/back.gif
无所谓,反正都是ssh登录的,不过高版本的内核是3.0的 可能在学习的时候会带来不便 ...
我根据XP下看到的地址,掩码,网关输入到ubuntu的有线连接信息,已经说连接成功了,但是为什么还是上不了火狐,而无线就什么也不用配置就可以上网. 标记下,慢慢来,谢谢分享 这个写的很详细啊,很好懂,多谢楼主! 学习学习,刚开始学ARM 好文章,mark 以后多多向楼主请教 收藏先,不错的文章 头晕了。。。
页:
[1]