zoukankan      html  css  js  c++  java
  • uboot配置和编译过程详解

    根据朱有鹏老师讲解整理

    一、uboot主Makefile分析

    1、uboot version确定(Makefile的24-29行)

    • include/version_autogenerated.h文件是编译过程中自动生成的一个文件,所以源目录中没有,但是编译过后的uboot中就有了

    2、HOSTARCH和HOSTOS

    • HOSTARCH:表示主机的CPU的架构,值会影响后面的CROSS_COMPILE环境变量的值。HOSTOS:主机

    3、静默编译(50-54行)

    • 不希望看到这些编译信息,就后台编译即可。这就叫静默编译。

    4、两种编译方法(Makefile的78-123行)。

    • 编译复杂项目,Makefile提供2种编译管理方法。默认情况下是当前文件夹中的.c文件,编译出来的.o文件会放在同一文件夹下。这种方式叫原地编译。原地编译的好处就是处理起来简单。
    • 原地编译有一些坏处:第一,污染了源文件目录。第二的缺陷就是一套源代码只能按照一种配置和编译方法进行处理,无法同时维护2个或2个以上的配置编译方式。
    • 为了解决以上2种缺陷,uboot支持单独输出文件夹方式的编译(linux kernel也支持,而且uboot的这种技术就是从linux kernel学习来的)。基本思路就是在编译时另外指定一个输出目录,将来所有的编译生成的.o文件或生成的其他文件全部丢到那个输出目录下去。源代码目录不做任何污染,这样输出目录就承载了本次配置编译的所有结果。
    • 具体用法:默认的就是原地编译。如果需要指定具体的输出目录编译则有2种方式来指定输出目录。(具体参考Makefile 56-76行注释内容)

    第一种:make O=输出目录 

    第二种:export BUILD_DIR=输出目录 然后再make

    如果两个都指定了(既有BUILD_DIR环境变量存在,又有O=xx),则O=xx具有更高优先级,听他的。

    5、记录编译后的.o文件往哪里放

    • OBJTREE:编译出的.o文件存放的目录的根目录。在默认编译下,OBJTREE等于当前目录;在O=xx编译下,OBJTREE就等于我们设置的那个输出目录。
    • SRCTREE: 源码目录,其实就是源代码的根目录,也就是当前目录。
    • 总结:在默认编译下,OBJTREE和SRCTREE相等;在O=xx这种编译下OBJTREE和SRCTREE不相等。Makefile中定义这两个变量,其实就是为了记录编译后的.o文件往哪里放,就是为了实现O=xx的这种编译方式的。

    6、MKCONFIG(Makefile的101行)

    • Makefile中定义的一个变量(在这里定义,在后面使用),它的值就是我们源码根目录下面的mkconfig。这个mkconfig是一个脚本,这个脚本就是uboot配置阶段的配置脚本。后面要用至少3节课详细讲这个配置脚本的工作。

    7、包含config.mk(133行)

    • include/config.mk不是源码自带的(你在没有编译过的源码目录下是找不到这个文件的),要在配置过程(make x210_sd_config)中才会生成这个文件。因此这个文件的值和我们配置过程有关,是由配置过程根据我们的配置自动生成的。
    • 调用MKCONFIG脚本传参时的参数

    8、定义交叉编译工具链的前缀(136-182

    • CROSS_COMPILE是被ARCH所确定的,只要配置了ARCH=arm,那么我们就只能在ARM的那个分支去设置CROSS_COMPILE的值

    9、包含/uboot/config.mk(188)

    10、主Makefile中第一个目标all(291)

    二、uboot配置过程详解  mkconfig分析(make  x210_sd_config)

    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
    • 所以,$# = 6

    2、确定BOARD_NAME="$1"(23)

    3、判断传参的个数,传参正确往下执行(25)

    4、创建符号链接(33-118)

    • 第一个:在include目录下创建asm文件,指向asm-arm。(46-48行)
    • 第二个:在inlcude/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

    5、创建include/config.mk文件(123-129)

    6、创建(默认情况)/追加(make -a时追加)include/config.h文件(134-141)

    三、config.mk详解

    • 编译工具定义(config.mk 94-107行)
    • 包含开发板配置项目(config.mk, 112行)
    • 定义链接脚本名称(145)
    • 指定链接地址TEXT_BASE = 0xc3e00000
    •  自动推导规则(239-256)

  • 相关阅读:
    广域网(ppp协议、HDLC协议)
    0120. Triangle (M)
    0589. N-ary Tree Preorder Traversal (E)
    0377. Combination Sum IV (M)
    1074. Number of Submatrices That Sum to Target (H)
    1209. Remove All Adjacent Duplicates in String II (M)
    0509. Fibonacci Number (E)
    0086. Partition List (M)
    0667. Beautiful Arrangement II (M)
    1302. Deepest Leaves Sum (M)
  • 原文地址:https://www.cnblogs.com/zyj23/p/12312606.html
Copyright © 2011-2022 走看看