本文内容来自对 《朱有鹏嵌入式linux核心课程》学习总结
uboot 配置过程详解
1. mkconfig 脚本的6个参数
-
$(@:_config=) arm s5pc11x x210 samsung s5pc110
-
x210_sd_config
里的_config
部分用空替换,得到:x210_sd
,这就是第一个参数,所以:$1: x210_sd $2: arm $3: s5pc11x $4: x210 $5: samsumg $6: s5pc110
所以,
S#
= 6 -
第23行:看
BOARD_NAME
变量是否有值,如果有值就维持不变,如果无值就将$1
给他赋值,结果为:BOARD_NAME = x210_sd
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 [ "${BOARD_NAME}" ] || BOARD_NAME="$1"
-
第25行:如果
$#
小于4,则exit 1
(mkconfig
脚本返回1) -
第26行:如果
$#
小于6,则也返回1
所以:mkconfig
脚本传参只能是4,5,6,如果大于6或者小于4都不行。[ $# -lt 4 ] && exit 1 [ $# -gt 6 ] && exit 1 echo "Configuring for ${BOARD_NAME} board..."
-
第33行到第118行,都是在创建符号链接。为什么要创建符号链接?这些符号链接文件的存在就是整个配置过程的核心,这些符号链接文件(文件夹)的主要作用是给头文件包含等过程提供指向链接。根本目的就是让
uboot
具有可移植性。
uboot
的可移植性的实现原理:在uboot
中有很多彼此平行的代码,各自属于各自不同的架构/CPU/开发板,我们在具体到一个开发板的编译时用符号链接的方式提供一个具体的名字的文件夹供编译时使用。这样就可以在配置的过程中通过不同的配置使用不同的文件,就可以正确的包含正确的文件。 -
创建的符号链接:
第一个:在include
目录下创建asm
文件,指向asm-arm
。(46-48行)
第二个:在include/asm-arm
下创建一个arch
文件,指向include/asm-arm/arch-s5pc110
第三个:在include目录下创建regs.h文件,指向include/s5pc110.h
删除第二个。
第四个:在inlcude/asm-arm下创建一个arch文件,指向include/asm-arm/arch-s5pc11x
第五个:在include/asm-arm下创建一个proc文件,指向include/asm-arm/proc-armv
总结:一共创建了4个符号链接。这4个符号链接将来在写代码过程中,头文件包含时非常有用。譬如一个头文件包含可能是:
#include <asm/xx.h>
-
创建
include/config.mk
文件(mkconfig
文件123-129行)# # 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
-
创建
include/config.mk
文件是为了让Makefile
在第133行去包含的。 -
思考:
uboot
的配置和编译过程的配合。编译的时候需要ARCH=arm,CPU=xx
等这些变量来指导编译,配置的时候就是为编译阶段提供这些变量。那为什么不在Makefile
中直接定义这些变量去使用,而要在mkconfig
脚本中创建config.mk
文件然后又在Makefile
中include
这些文件呢? -
创建(默认情况)/追加(
make -a
时追加)include/config.h
文件(mkconfig
文件的134-141行)。 -
这个文件里面的内容就一行
#include <configs/x210_sd.h>
,这个头文件是我们移植x210
时最主要的文件。 -
x210_sd.h
文件会被用来生成一个autoconfig.mk
文件,这个文件会被主Makefile
引入,指导整个编译过程。这里面的这些宏定义会影响我们对uboot
中大部分.c
文件中一些条件编译的选择。从而实现最终的可移植性。
注意:uboot
的整个配置过程,很多文件之间是有关联的。uboot
中配置和编译过程,所有的文件或者全局变量都是字符串形式的。
2. uboot 的脚本链接
ENTRY(_start)
用来指定整个程序的入口地址。所谓入口地址就是整个程序的开头地址,可以认为就是整个程序的第一句指令。有点像C
语言中的main
。- 指定程序的链接地址有两种方法:一种是在
Makefile
中ld
的flags
用-Ttext 0x20000000
来指定;第二种是在链接脚本的SECTIONS
开头用.=0x20000000
来指定。两种都可以实现相同效果。这两种技巧可以配合使用。就是在链接脚本中指定也在ld flags
中用-Ttext
来指定。如果两个都指定以-Ttext
指定的为准。 uboot
的最终链接起始地址就是在makefile
中用-Ttext
来指定的,注意TEXT_BASE
变量,最终来源是Makefile
中配置对应的命令中,在make xxx_config
时得到的。- 在代码段中注意文件排列的顺序。指定必须放在前面部分的那些文件就是那些文件就是那些必须安排在前16kb内的文件,这些文件中的函数在前16kb会被调用。在后面第二部分(16kb之后)中调用的程序,前后顺序就无所谓了。
- 链接脚本中除了
.text
,.data
,.rodata
,.bss
段等编译工具自带的段之外,编译工具还允许我们自定义段。譬如uboot
中的.u_boot_cmd
段就是自定义段。