嵌入式linux软件系统从软件角度通常可分一下4个层面:
1 引导加载程序。BootLoader作为之一,作用是初始化硬件设备、建立内存空间映射图,准备好软件环境, 最后调用操作系统内核运行。
2 Linux内核
3 文件系统。 包含了linux系统能够运行的应用程序和库等。
Boot parameters分区中存放了一些参数,比如波特率,ip地址等。
U-Boot,即通用 Bootloader,支持多种操作系统内核和处理器。
我们在使用uboot之前都要对其进行配置和编译过程。配置命令是make <boad.name>_config 编译命令是make all
那这两条命令做了什么事情呢?
uboot配置过程
这里我用的是uboot-1.1.16很老的东西,新版uboot增加了很多功能,并进行了优化,与老版差距较大。想要了解哪些文件首先调用,可执行文件占用内存情况,最好的方法就是阅读Makefile。
在顶层Makefile中有如下代码:
MKCONFLG源代码下的mkconfig文件 (MKCONFLG:=$(SRCTREE)/mkconfig )
$@表示目标 “= ”表示替换
所以我们执行make smdk2410_config 相当于执行mkconfig文件传递 arm arm920t smdk2410 NULL s3c24x0等参数
mkconfig文件
APPEND=no # Default: Create new config file
BOARD_NAME="" # Name to print in make output
TARGETS=""
while [ $# -gt 0 ] ; do
case "$1" in
--) shift ; break ;;
-a) shift ; APPEND=yes ;;
-n) shift ; BOARD_NAME="${1%%_config}" ; shift ;;
-t) shift ; TARGETS="`echo $1 | sed ‘s:_: :g‘` ${TARGETS}" ; shift ;;
*) break ;;
esac
done
$#是脚本传递的参数的个数。-gt是>的意思。 $1:第一个参数。shift:去掉第一个参数,将第二参数变成第一个……这段代码意思 检查参数中,有无-a -n -t这样的参数,没有的话直接break,传递的参数并没有-a -n,直接跳过
[ "${BOARD_NAME}" ] || BOARD_NAME="$1"
[ $# -lt 4 ] && exit 1
[ $# -gt 6 ] && exit 1
if [ "${ARCH}" -a "${ARCH}" != "$2" ]; then
echo "Failed: \$ARCH=${ARCH}, should be ‘$2‘ for ${BOARD_NAME}" 1>&2
exit 1
fi
echo "Configuring for ${BOARD_NAME} board..."
这是一个判断语句,如果BOARD_NAME成立,就不会执行 BOARD_NAME="$1",BOARD_NAME变量从声明开始一直是空,到这里给他赋值$1
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
fi
rm -f asm-$2/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
if [ "$2" = "arm" ] ; then
rm -f asm-$2/proc
ln -s ${LNPREFIX}proc-armv asm-$2/proc
fi
# Create include 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
# Assign board directory to BOARDIR variable
if [ -z "$5" -o "$5" = "NULL" ] ; then
BOARDDIR=$4
else
BOARDDIR=$5/$4
fi
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
for i in ${TARGETS} ; do
echo "#define CONFIG_MK_${i} 1" >>config.h ;
done
cat << EOF >> config.h
#define CONFIG_BOARDDIR board/$BOARDDIR
#include <config_defaults.h>
#include <configs/$1.h>
#include <asm/config.h>
EOF
exit 0
至此,make smdk2410_config命令已经结束,回顾一下就是创建了include/config.mk和include/config.h,其中include/config.mk文件中记录着u-boot的版本信息,include/config.h中包含了 configs/$1.h,此文件里记录着是很多很多以CONFIG_开头的宏,是开发板u-boot的主配置信息。
刚开始学嵌入式linux系统,想把一些知识要点心得写一下,这篇借鉴了很多网上大神的文章,如果有什么写错或写的不好的希望广大网友指出,谢谢!
本文出自 “任性有了,就差钱了” 博客,请务必保留此出处http://13095698.blog.51cto.com/13085698/1943846
原文:http://13095698.blog.51cto.com/13085698/1943846