文章目录
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 /