本文内容来自对 《朱有鹏嵌入式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_sdAPPEND=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段就是自定义段。
本文深入解析U-Boot的配置过程,包括mkconfig脚本的参数详解及符号链接的作用,阐述如何通过配置实现U-Boot的可移植性。同时,文章探讨了U-Boot的脚本链接,如ENTRY(_start)的使用,以及链接脚本中不同段的排列顺序对程序的影响。
491

被折叠的 条评论
为什么被折叠?



