01 uboot的配置和编译

uboot编译体验

windows与linux的启动过程对比

windows linux
上电 上电
BIOS BootLoader
引导操作系统 启动linux内核
识别磁盘 挂接根文件系统
运行应用程序 运行应用程序

BootLoader的最终目的:启动内核

uboot编译

解压老韦准备好的uboot源文件,并打好补丁,配置,然后编译,注意如果权限不够,最好将整个文件夹递归chmod,给权限777

patch -p1 < ../u-boot-1.1.6_jz2440.patch
make 100ask24x0_config
make

uboot烧录

使用老韦提供的oflash,在nand flash中完成烧录

uboot菜单

开机按空格,进入boot菜单
q退出
menu进入
help帮助
? + 指令查看使用方法
查看环境变量 pri
设置环境变量set
保存save

希望uboot实现的功能

从Flash读出内核
初始化SDRAM
将内核放到SDRAM
初始化时钟
启动内核

烧写Flash
网卡功能
USB功能
串口功能

uboot Makefile分析

一般编译的步骤为

  • 先make xxxconfig配置
  • 再make编译

分析配置过程

make 100ask24x0

在makefile可以看到配置的时候,执行的指令

100ask24x0_config	:	unconfig
	@$(MKCONFIG) $(@:_config=) arm arm920t 100ask24x0 NULL s3c24x0

首先看MKCONFIG指的是什么,应该是源文件下的mkconfig

MKCONFIG	:= $(SRCTREE)/mkconfig
export MKCONFIG

@$(MKCONFIG),其中的@,表示在执行命令时不输出命令本身(不回显),只输出命令执行的结果
$(@:_config=),这里用到了makefile的变量替换规则,$(VAR:A=B)表示替换变量$(VAR)中的A为B,这里的A位_config,B为空,VAR是$@,意思是目标文件,一般写在行首,往上找一行,发现$@的其实就是代指100ask24x0_config,所以最后的效果是将100ask24x0_config中的_config替换为空

得到替换后的表示形式

100ask24x0_config	:	unconfig
	mkconfig 100ask24x0 arm arm920t 100ask24x0 NULL s3c24x0

当执行配置命令的时候,就相当于去执行这个脚本mkconfig 100ask24x0 arm arm920t 100ask24x0 NULL s3c24x0

下一步去mkconfig脚本去分析
这一段是对传进来的参数进行判断,目前我们传的参数跟--,-a,-n,*无关,所以不用管

while [ $# -gt 0 ] ; do
	case "$1" in
	--) shift ; break ;;
	-a) shift ; APPEND=yes ;;
	-n) shift ; BOARD_NAME="${1%%_config}" ; shift ;;
	*)  break ;;
	esac
done

是否已经定义过BOARD_NAME,默认是没有的,如果没有定义过的话,就使用传进来的第一个参数$1,注意在shell脚本中,$0代表的是脚本文件名,参数是从$1开始的,这里的$1代指100ask24x0,执行完后的结果是变量BOARD_NAME的值为100ask24x0

BOARD_NAME=""	# Name to print in make output
[ "${BOARD_NAME}" ] || BOARD_NAME="$1"

下面分析参数的个数是否正常,@#就代指参数的个数,注意@#不把 0 算 在 内 , 因 此 这 里 的 0算在内,因此这里的 0#值是6
当参数的个数小于4,或者大于6,则认为异常,脚本直接退出

[ $# -lt 4 ] && exit 1
[ $# -gt 6 ] && exit 1

这是一句打印到终端的话,在脚本中使用echo打印字符串到屏幕显示,做提示用

echo "Configuring for ${BOARD_NAME} board..."

以下代码先判断SRCTREE和OBJTREE是否相等,这两个变量要去Makefile去找,如下
OBJTREE := $(if $(BUILD_DIR),$(BUILD_DIR),$(CURDIR))
SRCTREE := $(CURDIR)
其中要知道$(CURDIR),CURDIR是Makefile内嵌的变量,即使没有定义,也能使用,它就代表当前目录
第一句话,如果定义过变量BUILD_DIR,则OBJTREE=BUILD_DIR,否则OBJTREE=CURDIR
由于没有定义过变量BUILD_DIR,因此OBJTREE和SRCTREE,都等于CURDIR
因此,这段代码,最终执行else分支,其中$2为arm,执行的结果是先强制删除文件asm(无论是否存在),然后创建一个链接文件asm,指向目录asm-arm
为什么会创建这个链接,主要是为了少修改代码,例如我们写程序时,有时要去包含头文件#include <asm/type.h>,这里的asm就会自动替换为asm-arm,去asm-arm目录下找type.h文件,下次如果编译i386时,它也会自动替换为#include <asm-i386/type.h>,这样换平台编译时,不用我们手动去修改代码,方便了很多

if [ "$SRCTREE" != "$OBJTREE" ] ; then
	。。。//太长省略
else
	cd ./include
	rm -f asm
	ln -s asm-$2 asm        //$2=arm
fi

$2指的是arm,因此替换后rm -f asm-arm/arch,删除asm-arm目录下的arch文件,如果你执行过配置的话,发现这个arch文件也是一个链接文件

rm -f asm-$2/arch /
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值