嵌入式linux軟件系統從軟件角度一般可分一下4個層面:
linux
1 引導加載程序。BootLoader做爲之一,做用是初始化硬件設備、創建內存空間映射圖,準備好軟件環境, 最後調用操做系統內核運行。
ide
2 Linux內核優化
3 文件系統。 包含了linux系統可以運行的應用程序和庫等。spa
Boot parameters分區中存放了一些參數,好比波特率,ip地址等。操作系統
U-Boot,即通用 Bootloader,支持多種操做系統內核和處理器。3d
咱們在使用uboot以前都要對其進行配置和編譯過程。配置命令是make <boad.name>_config 編譯命令是make allorm
那這兩條命令作了什麼事情呢?
blog
uboot配置過程ip
這裏我用的是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系統,想把一些知識要點心得寫一下,這篇借鑑了不少網上大神的文章,若是有什麼寫錯或寫的很差的但願廣大網友指出,謝謝!