嵌入式linux软件系统从软件角度通常可分一下4个层面:

1 引导加载程序。BootLoader作为之一,作用是初始化硬件设备、建立内存空间映射图,准备好软件环境, 最后调用操作系统内核运行。

2 Linux内核

3 文件系统。 包含了linux系统能够运行的应用程序和库等。

wKioL1lYsASQZJznAABYbZpgJM8142.png-wh_50

Boot parameters分区中存放了一些参数,比如波特率,ip地址等。


U-Boot,即通用 Bootloader,支持多种操作系统内核和处理器。

我们在使用uboot之前都要对其进行配置和编译过程。配置命令是make <boad.name>_config   编译命令是make all

那这两条命令做了什么事情呢?


uboot配置过程

这里我用的是uboot-1.1.16很老的东西,新版uboot增加了很多功能,并进行了优化,与老版差距较大。想要了解哪些文件首先调用,可执行文件占用内存情况,最好的方法就是阅读Makefile。

在顶层Makefile中有如下代码:

wKiom1lYtv6SfDdBAAAvvSe_3no214.png

MKCONFLG源代码下的mkconfig文件  (MKCONFLG:=$(SRCTREE)/mkconfig )

$@表示目标 “= ”表示替换

所以我们执行make smdk2410_config 相当于执行mkconfig文件传递 arm arm920t smdk2410 NULL s3c24x0等参数



mkconfig文件

wKioL1lY2X-jseUBAABFe6ZX7Y0105.png

  1. APPEND=no    # Default: Create new config file  

  2. BOARD_NAME=""    # Name to print in make output  

  3. TARGETS=""  

  4. while [ $# -gt 0 ] ; do  

  5.     case "$1" in  

  6.     --) shift ; break ;;  

  7.     -a) shift ; APPEND=yes ;;  

  8.     -n) shift ; BOARD_NAME="${1%%_config}" ; shift ;;  

  9.     -t) shift ; TARGETS="`echo $1 | sed 's:_: :g'` ${TARGETS}" ; shift ;;  

  10.     *) break ;;  

  11.     esac  

  12. done  

$#是脚本传递的参数的个数。-gt是>的意思。 $1:第一个参数。shift:去掉第一个参数,将第二参数变成第一个……这段代码意思 检查参数中,有无-a -n -t这样的参数,没有的话直接break,传递的参数并没有-a -n,直接跳过

  1. "${BOARD_NAME}" ] || BOARD_NAME="$1"  

  2.   

  3. [ $# -lt 4 ] && exit 1  

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

  5.   

  6. if [ "${ARCH}" -a "${ARCH}" != "$2" ]; then  

  7.     echo "Failed: \$ARCH=${ARCH}, should be '$2' for ${BOARD_NAME}" 1>&2  

  8.     exit 1  

  9. fi  

  10.   

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

这是一个判断语句,如果BOARD_NAME成立,就不会执行 BOARD_NAME="$1",BOARD_NAME变量从声明开始一直是空,到这里给他赋值$1


  1. if [ "$SRCTREE" != "$OBJTREE" ] ; then  

  2.     mkdir -p ${OBJTREE}/include  

  3.     mkdir -p ${OBJTREE}/include2  

  4.     cd ${OBJTREE}/include2  

  5.     rm -f asm  

  6.     ln -s ${SRCTREE}/include/asm-$2 asm  

  7.     LNPREFIX="../../include2/asm/"  

  8.     cd ../include  

  9.     rm -rf asm-$2  

  10.     rm -f asm  

  11.     mkdir asm-$2  

  12.     ln -s asm-$2 asm  

  13. else  

  14.     cd ./include  

  15.     rm -f asm  

  16.     ln -s asm-$2 asm  

  17. fi  

  18.   

  19. rm -f asm-$2/arch  

  20.   

  21. if [ -z "$6" -o "$6" = "NULL" ] ; then  

  22.     ln -s ${LNPREFIX}arch-$3 asm-$2/arch  

  23. else  

  24.     ln -s ${LNPREFIX}arch-$6 asm-$2/arch  

  25. fi  

  26.   

  27. if [ "$2" = "arm" ] ; then  

  28.     rm -f asm-$2/proc  

  29.     ln -s ${LNPREFIX}proc-armv asm-$2/proc  

  30. fi  

这部分是创建软连接 创建很多链接文件。建立asm文件,连接到asm-arm目录,方便uboot采用通用方式来调用不同处理器的头文件和文件夹, 删除asm-arm下的arch文件,然后再建立arch文件

  1. # Create include file for Make  

  2. #  

  3. echo "ARCH = $2" > config.mk  

  4. echo "CPU = $3" >> config.mk  

  5. echo "BOARD = $4" >> config.mk  

  6.   

  7. "$5" ] && [ "$5" != "NULL" ] && echo "VENDOR = $5" >> config.mk  

  8.   

  9. "$6" ] && [ "$6" != "NULL" ] && echo "SOC = $6" >> config.mk  

  10.   

  11. # Assign board directory to BOARDIR variable  

  12. if [ -z "$5" -o "$5" = "NULL" ] ; then  

  13.     BOARDDIR=$4  

  14. else  

  15.     BOARDDIR=$5/$4  

  16. fi  

创建make时用到的包含文件 config.mk,">" 表示新建文件   ">>"表示添加内容到文件

  1. if [ "$APPEND" = "yes" ]     #Append to existing config file  

  2. then  

  3.     echo >> config.h  

  4. else  

  5.     > config.h        # Create new config file  

  6. fi  

  7. echo "/* Automatically generated - do not edit */" >>config.h  

  8.   

  9. for i in ${TARGETS} ; do  

  10.     echo "#define CONFIG_MK_${i} 1" >>config.h ;  

  11. done  

  12.   

  13. cat << EOF >> config.h  

  14. #define CONFIG_BOARDDIR board/$BOARDDIR  

  15. #include <config_defaults.h>  

  16. #include <configs/$1.h>  

  17. #include <asm/config.h>  

  18. EOF  

  19.   

  20. exit 0  

创建开发板特定的头文件 config.h

至此,make smdk2410_config命令已经结束,回顾一下就是创建了include/config.mk和include/config.h,其中include/config.mk文件中记录着u-boot的版本信息,include/config.h中包含了 configs/$1.h,此文件里记录着是很多很多以CONFIG_开头的宏,是开发板u-boot的主配置信息。


刚开始学嵌入式linux系统,想把一些知识要点心得写一下,这篇借鉴了很多网上大神的文章如果有什么写错或写的不好的希望广大网友指出,谢谢!