分析JZ2440的Uboot的配置和编译过程
2017-09-16 20:15
429 查看
大家都知道PC机在上电后,首先会启动BIOS,然后通过BIOS来启动Windows操作系统,然后识别出盘符(C盘、D盘),然后再执行应用程序。同样的道理嵌入式Linux系统,上电后,首先执行BootLoader,通过BootLoader启动linux内核,然后在挂接根文件系统,最后执行用户应用程序,通过分析可知BootLoader的最终目的是启动Linux内核
首先介绍一下的编译过程:
1、解压
tar jxvf u-boot-1.1.6.tar.bz2
2、在u-boot-1.1.6目录下进行打补丁
patch -p1 < ../ u-boot-1.1.6_jz2440.patch
3、配置
make 100ask24x0_config
4、编译
直接执行make即可
二、分析Uboot的配置过程
首先分析其配置过程,当我们执行make 100ask24x0_config时,相当执行如下命令,该命令在u-boot-1.1.6目录下的Makefile文件中:
100ask24x0_config : unconfig
@$(MKCONFIG) $(@:_config=) arm arm920t100ask24x0 NULL s3c24x0
其中MKCONFIG := $(SRCTREE)/mkconfig 源文件目录下的mkconfig文件
$(@:_config=)的意思是在目标名称100ask24x0_config 中去掉_config相当于100ask24x0
当我们执行make 100ask24x0_config的时候实际上相当于执行如下脚本,脚本文件位于u-boot-1.1.6目录下
# mkconfig 100ask24x0 arm arm920t 100ask24x0 NULL s3c24x0
# $0 $1 $2 $3 $4 $5 $6
APPEND=no # Default: Create new config file
BOARD_NAME="" # Name to print in make output
while [$# -gt 0 ] ; do # $#代表参数个数
case "$1" in
--) shift ; break ;;
-a) shift ; APPEND=yes ;;
-n) shift ;BOARD_NAME="${1%%_config}" ; shift ;;
*) break ;;
esac
done
mkconfig 100ask24x0 arm arm920t 100ask24x0 NULL s3c24x0命令中没有”--”、”-a”、”-n”等符号所以这几行代码没有任何意义
["${BOARD_NAME}" ] || BOARD_NAME="$1"
如果BOARD_NAME不为空则不执行BOARD_NAME="$1"
当BOARD_NAME为空时执行BOARD_NAME="$1"即就是BOARD_NAME=100ask24x0
[ $# -lt4 ] && exit 1
[ $# -gt6 ] && exit 1
$#表示参数的个数,上面代码的意思是参数个数小于4或者大于6退出
echo"Configuring for ${BOARD_NAME} board..."
打印Configuring for ${BOARD_NAME} board...即Configuring for 100ask24x0 board...
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
rm -f asm
ln -s asm-$2 asm
if条件不成立所以上面的代码执行else,相当于
cd ./include
rm -f asm
ln -s asm- arm asm #把asm-arm目录链接成asm目录
asm是指向asm-arm的连接文件
rm -fasm-$2/arch
相当于rm -f asm- arm /arch删除asm-arm目录下的arch目录
if [ -z"$6" -o "$6" = "NULL" ] ; then
ln -s ${LNPREFIX}arch-$3 asm-$2/arch
else
ln -s ${LNPREFIX}arch-$6 asm-$2/arch
fi
如果$6为空执行if 不为空时执行else ${LNPREFIX}无人定义 相当于空
所以ln -s ${LNPREFIX}arch-$6 asm-$2/arch
相当于 ln –s arch-s3c24x0 asm-arm/arch 创建asm-arm目录下arch文件该文件是arch-s3c24x0的连接文件
if ["$2" = "arm" ] ; then
rm -f asm-$2/proc
ln -s ${LNPREFIX}proc-armv asm-$2/proc
fi
如果$2==arm条件成立则rm -f asm-arm/proc
ln –s proc-armv asm-arm/proc 创建连接文件asm-arm/proc指向proc-armv
#
# Createinclude file for Make
#
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
创建配置文件 >表示创建文件 >>表示追加执行以上三条指令后
config.mk文件内容为:
ARCH = arm
CPU = arm920t
BOARD = 100ask24x0
SOC = s3c24x0
#
# Createboard specific header file
#
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
因为APPEND=no所以执行else
创建config.h
文件
内容:/* Automatically generated - do not edit */
#include <configs/100ask24x0 .h>
通过上面的分析可以知道在执行脚本
mkconfig 100ask24x0 arm arm920t 100ask24x0 NULL s3c24x0
即就是配置过程主要做一下操作:
1、 BOARD_NAME=100ask24x0即BOARD_NAME赋值为100ask24x0
2、 打印Configuring for ${BOARD_NAME} board... 即Configuring for 100ask24x0 board...
3、 cd./include #进入include目录
rm -f asm #删除include目录下的asm文件
ln -s asm- arm asm #创建连接文件asm,该文件指向asm- arm
rm -f asm-$2/arch
#相当于rm -f asm- arm /arch 删除asm-arm目录下的arch目录
ln –s arch-s3c24x0 asm-arm/arch
#创建asm-arm目录下arch文件 该文件是arch-s3c24x0的连接文件
rm -f asm-arm/proc #删除asm-arm目录下的proc文件
ln –s proc-armv asm-arm/proc #创建连接文件asm-arm/proc指向proc-armv
4、 创建config.mk文件,内容如下:该文件位于u-boot-1.1.6/include目录下
ARCH = arm #架构
CPU = arm920t #MCU
BOARD = 100ask24x0 #开发板名称
SOC = s3c24x0 #MCU型号
5、 创建config.h内容如下:#include <configs/100ask24x0 .h>该文件位于u-boot-1.1.6/include目录下
三、分析编译过程
u-boot-1.1.6/board/100ask24x0目录下:u-boot.lds是 u-boot的连接脚本
OUTPUT_FORMAT("elf32-littlearm","elf32-littlearm", "elf32-littlearm")
/*OUTPUT_FORMAT("elf32-arm","elf32-arm", "elf32-arm")*/
OUTPUT_ARCH(arm)
ENTRY(_start)
SECTIONS
{
. = 0x00000000;
//程序的链接地址=该地址+TEXT_BASE = 0x33F80000
//TEXT_BASE在u-boot-1.1.6/board/100ask24x0目录下的config.mk中定义
. = ALIGN(4);
.text :
{
cpu/arm920t/start.o (.text)
//第一个启动文件
board/100ask24x0/boot_init.o (.text)
*(.text)
}
. = ALIGN(4);
.rodata : { *(.rodata) }
. = ALIGN(4);
.data : { *(.data) }
. = ALIGN(4);
.got : { *(.got) }
. = .;
__u_boot_cmd_start = .;
.u_boot_cmd : { *(.u_boot_cmd) }
__u_boot_cmd_end = .;
. = ALIGN(4);
__bss_start = .;
.bss : { *(.bss) }
_end = .;
}
通过以上分析可知uboot的第一个启动文件为cpu/arm920t/start.o
本节就分析到这,下次从启动文件cpu/arm920t/start.o直接分析uboot的启动全过程
敬请期待!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
有嵌入式相关的设计开发需求,请联系我QQ:919104337
首先介绍一下的编译过程:
1、解压
tar jxvf u-boot-1.1.6.tar.bz2
2、在u-boot-1.1.6目录下进行打补丁
patch -p1 < ../ u-boot-1.1.6_jz2440.patch
3、配置
make 100ask24x0_config
4、编译
直接执行make即可
二、分析Uboot的配置过程
首先分析其配置过程,当我们执行make 100ask24x0_config时,相当执行如下命令,该命令在u-boot-1.1.6目录下的Makefile文件中:
100ask24x0_config : unconfig
@$(MKCONFIG) $(@:_config=) arm arm920t100ask24x0 NULL s3c24x0
其中MKCONFIG := $(SRCTREE)/mkconfig 源文件目录下的mkconfig文件
$(@:_config=)的意思是在目标名称100ask24x0_config 中去掉_config相当于100ask24x0
当我们执行make 100ask24x0_config的时候实际上相当于执行如下脚本,脚本文件位于u-boot-1.1.6目录下
# mkconfig 100ask24x0 arm arm920t 100ask24x0 NULL s3c24x0
# $0 $1 $2 $3 $4 $5 $6
APPEND=no # Default: Create new config file
BOARD_NAME="" # Name to print in make output
while [$# -gt 0 ] ; do # $#代表参数个数
case "$1" in
--) shift ; break ;;
-a) shift ; APPEND=yes ;;
-n) shift ;BOARD_NAME="${1%%_config}" ; shift ;;
*) break ;;
esac
done
mkconfig 100ask24x0 arm arm920t 100ask24x0 NULL s3c24x0命令中没有”--”、”-a”、”-n”等符号所以这几行代码没有任何意义
["${BOARD_NAME}" ] || BOARD_NAME="$1"
如果BOARD_NAME不为空则不执行BOARD_NAME="$1"
当BOARD_NAME为空时执行BOARD_NAME="$1"即就是BOARD_NAME=100ask24x0
[ $# -lt4 ] && exit 1
[ $# -gt6 ] && exit 1
$#表示参数的个数,上面代码的意思是参数个数小于4或者大于6退出
echo"Configuring for ${BOARD_NAME} board..."
打印Configuring for ${BOARD_NAME} board...即Configuring for 100ask24x0 board...
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
rm -f asm
ln -s asm-$2 asm
if条件不成立所以上面的代码执行else,相当于
cd ./include
rm -f asm
ln -s asm- arm asm #把asm-arm目录链接成asm目录
asm是指向asm-arm的连接文件
rm -fasm-$2/arch
相当于rm -f asm- arm /arch删除asm-arm目录下的arch目录
if [ -z"$6" -o "$6" = "NULL" ] ; then
ln -s ${LNPREFIX}arch-$3 asm-$2/arch
else
ln -s ${LNPREFIX}arch-$6 asm-$2/arch
fi
如果$6为空执行if 不为空时执行else ${LNPREFIX}无人定义 相当于空
所以ln -s ${LNPREFIX}arch-$6 asm-$2/arch
相当于 ln –s arch-s3c24x0 asm-arm/arch 创建asm-arm目录下arch文件该文件是arch-s3c24x0的连接文件
if ["$2" = "arm" ] ; then
rm -f asm-$2/proc
ln -s ${LNPREFIX}proc-armv asm-$2/proc
fi
如果$2==arm条件成立则rm -f asm-arm/proc
ln –s proc-armv asm-arm/proc 创建连接文件asm-arm/proc指向proc-armv
#
# Createinclude file for Make
#
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
创建配置文件 >表示创建文件 >>表示追加执行以上三条指令后
config.mk文件内容为:
ARCH = arm
CPU = arm920t
BOARD = 100ask24x0
SOC = s3c24x0
#
# Createboard specific header file
#
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
因为APPEND=no所以执行else
创建config.h
文件
内容:/* Automatically generated - do not edit */
#include <configs/100ask24x0 .h>
通过上面的分析可以知道在执行脚本
mkconfig 100ask24x0 arm arm920t 100ask24x0 NULL s3c24x0
即就是配置过程主要做一下操作:
1、 BOARD_NAME=100ask24x0即BOARD_NAME赋值为100ask24x0
2、 打印Configuring for ${BOARD_NAME} board... 即Configuring for 100ask24x0 board...
3、 cd./include #进入include目录
rm -f asm #删除include目录下的asm文件
ln -s asm- arm asm #创建连接文件asm,该文件指向asm- arm
rm -f asm-$2/arch
#相当于rm -f asm- arm /arch 删除asm-arm目录下的arch目录
ln –s arch-s3c24x0 asm-arm/arch
#创建asm-arm目录下arch文件 该文件是arch-s3c24x0的连接文件
rm -f asm-arm/proc #删除asm-arm目录下的proc文件
ln –s proc-armv asm-arm/proc #创建连接文件asm-arm/proc指向proc-armv
4、 创建config.mk文件,内容如下:该文件位于u-boot-1.1.6/include目录下
ARCH = arm #架构
CPU = arm920t #MCU
BOARD = 100ask24x0 #开发板名称
SOC = s3c24x0 #MCU型号
5、 创建config.h内容如下:#include <configs/100ask24x0 .h>该文件位于u-boot-1.1.6/include目录下
三、分析编译过程
u-boot-1.1.6/board/100ask24x0目录下:u-boot.lds是 u-boot的连接脚本
OUTPUT_FORMAT("elf32-littlearm","elf32-littlearm", "elf32-littlearm")
/*OUTPUT_FORMAT("elf32-arm","elf32-arm", "elf32-arm")*/
OUTPUT_ARCH(arm)
ENTRY(_start)
SECTIONS
{
. = 0x00000000;
//程序的链接地址=该地址+TEXT_BASE = 0x33F80000
//TEXT_BASE在u-boot-1.1.6/board/100ask24x0目录下的config.mk中定义
. = ALIGN(4);
.text :
{
cpu/arm920t/start.o (.text)
//第一个启动文件
board/100ask24x0/boot_init.o (.text)
*(.text)
}
. = ALIGN(4);
.rodata : { *(.rodata) }
. = ALIGN(4);
.data : { *(.data) }
. = ALIGN(4);
.got : { *(.got) }
. = .;
__u_boot_cmd_start = .;
.u_boot_cmd : { *(.u_boot_cmd) }
__u_boot_cmd_end = .;
. = ALIGN(4);
__bss_start = .;
.bss : { *(.bss) }
_end = .;
}
通过以上分析可知uboot的第一个启动文件为cpu/arm920t/start.o
本节就分析到这,下次从启动文件cpu/arm920t/start.o直接分析uboot的启动全过程
敬请期待!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
有嵌入式相关的设计开发需求,请联系我QQ:919104337
相关文章推荐
- uboot 分析之 配置+编译过程
- 10 uboot的配置及编译过程分析
- ok6410-uboot的配置和编译过程分析
- uboot编译配置过程分析
- uboot配置和启动过程2(mkconfig分析)
- 05-S3C2440学习之内核(初步)编译、配置过程分析
- Uboot的配置过程分析
- uboot学习——配置过程分析
- UBOOT编译学习-----配置过程
- S5PV210-uboot配置和编译过程
- uboot系列之----Uboot配置过程详细分析
- u-boot-1.1.6的配置编译过程分析.doc
- uboot系列之----Uboot配置过程详细分析
- u-boot-2012.04.01的配置编译过程分析.doc
- uboot的编译过程分析---Makefile分析
- uboot的编译和链接过程分析(一)
- uboot分析(一):配置及编译
- uboot 配置 编译 连接全过程