目录
3.3 虽然uboot最终目的是启动内核,但是在开发阶段我们想增加更多的功能方便开发(次要目的):
4.1.分析配置过程make 100ask24x0_config 命令
u-boot分析之编译体验
1. 嵌入式系统与pc系统的启动对比概述
2.如何应用补丁文件生成uboot.bin文件,步骤:
①解压缩
tar -xjvf u-boot-1.1.6.tar.bz2
②打补丁
cd u-boot-1.1.6/
patch -p1 < ../u-boot-1.1.6_jz2440.patch //patch -p? < ../补丁文件
③配置
make 100ask24x0_config
④编译
make all
在编译得到u-boot.bin文件之后,我们就可以将文件下载到开发板nor flash上去,启动板子串口3秒内按任意键输出界面如下,出现的命令菜单选项并非uboot自带,而是后续添加上去的,如何添加命令菜单后续有介绍。uboot支持很多的命令,输入'q'退出菜单模式,进入命令行模式,在命令行输入?或者help查看支持的所有命令。特别的,输入menu回到菜单模式。菜单的功能是通过usb(usb device线)下载uboot,内核,文件系统。
3. uboot里要实现的功能
3.1 uboot最终目的是启动内核
1.从flash读出内核放到sdram
2.启动内核
3.2 为达到最终目的uboot要实现的功能(核心目的):
1.关看门狗
2.初始化时钟(开发板上电,时钟的运行频率是12M,2440最大的频率是400M)
3.初始化SDRAM
4.从读Flash读出内核
5.启动内核
其中1,2,3等步是硬件相关初始化。
3.3 虽然uboot最终目的是启动内核,但是在开发阶段我们想增加更多的功能方便开发(次要目的):
1.初始化串口
2.烧写flash(这样就可以通过网络,串口下载将uboot,kenel,filesystem下载到flash上去)
3.网卡,usb等等
4.u-boot功能,结构,结合Makefile进行分析
4.1.分析配置过程make 100ask24x0_config 命令
1.在uboot顶层目录下的makefile中搜索100ask24x0_config 结果如下
100ask24x0_config : unconfig
100ask24x0_config : unconfig
@$(MKCONFIG) $(@:_config=) arm arm920t 100ask24x0 NULL s3c24x0
MKCONFIG定义为
MKCONFIG := $(SRCTREE)/mkconfig
所以输入make 100ask24x0_config命令相当于执行:
./mkconfig 100ask24x0 arm arm920t 100ask24x0 NULL s3c24x0
# $0 $1 $2 $3 $4 $5 $6
mkconfig的作用,在mkconfig文件开头第六行给出了它的用法:
06 # Parameters: Target Architecture CPU Board [VENDOR] [SOC]
分步骤分析mkconfig的作用:
(1)确定开发板名称BOARD_NAME
BOARD_NAME等于$1
(2)创建到平台/开发板相关的头文件的链接
ln -s asm-$2 asm
ln -s arch-$6 asm-$2/arch
ln -s proc-armv asm-$2/proc #如果$2不是arm的话,此行没有
(3)创建顶层Makefile包含的文件include/config.mk,内容追加为:
ARCH = $2
CPU = $3
BOARD = $4
VENDOR = $5 #$5为空,或者是NULL的话,此行没有
SOC = $6 #$6为空,或者是NULL的话,此行没有
(4)创建开发板相关的头文件include/config.h,内容追加为:
/* Automatically generated - do not edit */
#include <configs/100ask24x0.h>
从这4个结果可以知道,如果要在board目录下新建一个开发板<board_name>的目录,则在include/configs目录下也要建立一个文件<board_name>.h,里面存放的就是开发板<board_name>的配置信息。
-----------------------------------------------------------------------------------------------------------------------
扩展: Shell脚本中$?、$!、$$、$*、$#、$@、$-、$0、$1~$n等的意义说明
$?
最后运行的命令的结束代码(返回值)。
$!
Shell最后运行的后台Process的PID(后台运行的最后一个进程的进程ID号)。
$$
Shell本身的PID(ProcessID,即脚本运行的当前进程ID号)。
$*
所有参数列表。如"$*"用「"」括起来的情况、以"$1 $2 … $n"的形式输出所有参数,此选项参数可超过9个。
$#
添加到Shell的参数个数。
$@
所有参数列表。如"$@"用「"」括起来的情况、以"$1" "$2" … "$n" 的形式输出所有参数。$@ 跟$*类似,但是可以当作数组用。
$-
显示shell使用的当前选项,与set命令功能相同。
$0
Shell本身的文件名。
$1~$n
添加到Shell的各参数值。$1是第1参数、$2是第2参数…。
-----------------------------------------------------------------------------------------------------------------------
4.2.分析编译过程make all命令
1.incldue $(OBJTREE)/include/config.mk
2.ifeq($(ARCH),arm) CROSS_COMPLIE = arm-linux-
3.include $(TOPDIR)/config.mk
4.OBJS、OBJS、LIBS等变量:
OBJS = cpu/arm920t/start.o
OBJS = lib_genertic/libgeneric.a
LIBS+=board/100ask24x0/lib100ask24x0.a
LIBS+=cpu/arm920t/libarm920t.a
5.在执行make 的时候如果不指定目标,他就执行第一个目标
(1) all: $(ALL) # all依赖于ALL
(2) ALL = (obj)u−boot.srec(obj)u-boot.bin(obj)System.map(U_BOOT_NAND)
(3) 我们的目的是生成u-boot.bin
(4) (obj)u−boot.bin:(obj)u-boot #u-boot.bin又依赖于elf格式的u-boot
(5) (obj)u−boot:dependversion(SUBDIRS) (OBJS)(LIBS)$(LDSCRIPT)…… #u-boot又依赖于OBJS, LIBS,链接脚本等
6.不想那么麻烦的分析makefile,可以输入make命令后查看最后面的打印信息
7.通过查看打印信息,可以看到这样一句话。arm-linux-ld -Bstatic -T /work/sysytem/u-boot-1.1.6/board/100ask24x0/u-boot.lds -Ttext 0x33f80000 $UNDEF_SYM cpu/arm920t/start.o #链接的时候依赖两个东西,原材料和链接脚本。链接脚本指示映像文件的组织结构。
8.分析u-boot.lds文件(.=0x00000000 0x00000000要加上0x33f80000=uboot运行地址)一开始运行的文件是cpu/arm920t/start.o文件
9.链接地址(运行地址)由连接文件board/100ask24x0/u-boot.lds和board/100ask24x0/config.mk TEXT_BASE共同指定,TEXT_BASE在顶层目录的config.mk LDFLAGS中被引用。
转载:https://blog.csdn.net/wenxiHuang/article/details/72510243