5. uboot配置过程详解

本文内容来自对 《朱有鹏嵌入式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文件然后又在Makefileinclude这些文件呢?

  • 创建(默认情况)/追加(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
  • 指定程序的链接地址有两种方法:一种是在Makefileldflags-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段就是自定义段。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

lzg2021

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值