zoukankan      html  css  js  c++  java
  • 配置介绍

    一、配置介绍

    1.1 常用命令  

      当前 uboot 的配置已经完全变成Linux 内核的配置形式了,完全可以按照Linux 内核的分析方是区分析 uboot。

      uboot 和 Linux的代码配置项由 Kconfig 来完成的,关于 Kconfig 语法,可参见:linux/Documentation/kbuild/kconfig-language.txt

      在编译时,先进行配置,目的是根据需求选择功能以及编译生成方式类型(模式或包含在内核中).

      配置项操作可以由如下命令中的其中一条来完成:

       make config, make menuconfig, make oldconfig, make xx_defconfig

    • make config:这个要求用户手动选择所有配置项,配置完成后生成 .config 文件。
    • make menuconfig:显示以curses的图形配置菜单,当已有.config文件存在时,它会根据 .config 文件设定默认项。若不存在 .config 文件,则根据各级 Kconfig 文件来设定菜单项。完成配置后,生成.config文件。
    • make oldconfig:与 make menuconfig 相同,区别在于这个没有图形界面,当已有 .config 文件存在时,它根据.config文件设定默认项,若kconfig有新配置项时,会提示你进行选择;若不存在 .config 文件,则根据各级 Kconfig 文件来设定菜单项。完成配置后,生成 .config 文件。

      若已存在 .config 文件,make menuconfig 及 make oldconfig 都会把原 .config 另存为 .config.old。

    • make xx_defconfig: 一般源码中都有不同硬件平台的默认配置文件,你也可以制做自己的默认配置文件,当这个命令执行时,它会根据 kconfig 及 xx_defconfig 来生成 .config 文件。

      在执行完其中一条 config 命令后,会生成 .config 及 autoconf 文件,autoconf 是根据配置项生成的相应宏定义,供 makefile 使用,当执行 make 命令时,就会根据 autoconf 定义的宏及 makefile 去编译源码。

      u-boot的编译跟kernel编译一样,分两步执行: 
      - 第一步:配置,执行make xxx_defconfig进行各项配置,生成.config文件 
      - 第二部:编译,执行make进行编译,生成可执行的二进制文件u-boot.bin或u-boot.elf

    1.2 Linux 内核构建系统所支持的目标

      make targets,targets 就是我们前述的那些命令,我们可以通过 make help 打印出来内核构建系统所支持的目标完整列表。

      如下所示,是 make help 所打印的所有目标:

      

    • clean 目标
      • clean:清除大多数生成的文件,但是保留配置
      • mrproper:清除所有生成的文件、配置文件和各种备份文件
      • distclean:此项就是 mrproper 的升级版本,多加了清除备份和补丁文件  

      

    • 配置项目标:
      • config:利用命令行更新当前配置
      • nconfig:使用基于ncurses菜单的程序更新当前配置
      • menuconfig:利用菜单程序更新当前配置
      • xconfig:利用基于Qt的前端更新当前配置
      • gconfig:利用基于GTK +的前端更新当前配置
      • oldconfig:使用提供的.config作为基础更新当前配置
      • localmodconfig:更新当前配置禁用未加载的模块
      • localyesconfig:更新当前配置将本地mods转换为core
      • silentoldconfig:与oldconfig相同,但是安静地更新deps
      • defconfig:来自ARCH的默认配置提供了defconfig
      • savedefconfig:保存当前配置为./defconfig(最小配置)
      • allnoconfig:新的配置,所有选项的答案都是no
      • allyesconfig:新的配置,所有选项的答案都是yes
      • allmodconfig:新的配置,尽可能的选择模块
      • alldefconfig:将所有符号设置为默认值的新配置
      • randconfig:对所有选项进行随机答案的新配置
      • listnewconfig:列出新选项
      • olddefconfig:与 silentoldconfig 相同,但是对默认值设置新的符号  

      

    • 其他通用目标
      • all:根据配置构建所有必要的镜像
      • tests:为 sandbox 构建 U-Boot,并测试
      • * u-boot:构建空的 uboot
      • dir/ :在dir和子目录下构建所有文件
      • dir/file.[oisS] :仅构建指定的目标
      • dir/file.lst :仅构建指定的混合源/汇编目标(需要最新的binutils和最新的版本(System.map))
      • tags/ctags:生成 ctags 索引文件
      • etags:生成 etags 索引文件
      • cscope:生成 cscope 索引
      • ubootrelease:输出发行版本字符串(需要用 make -s)
      • ubootversion:输出保存在 Makefile 中的版本(需要用 make -s)
      • cfg:不构建,仅仅只创建 .cfg 文件
      • envtools:只构建目标端环境工具  

      

    • 静态分析:
      • checkstack:生成堆栈列表
      • coccicheck:用Coccinelle执行静态代码分析  

      

      文件目标 就是 uboot 中所有格式的文件,之后就是构建时候 可以传入的参数。

      最后还由一段话,就是 执行 make  或  make all  的时候,构建所有以 * 开头的目标,这里只有  * u-boot ,即使执行此项。

      构建系同与 .config 相关的目标,就是上面用配置目标  

    1.3 构建系统的文件

    1.3.1 文件介绍

      在 ./Document/kbuild/makefiles.txt 中有详细介绍

    • Makefiles 有 5 个部分:
      • Makefile:顶层 Makefile,提供针对各种目标的接口,一般和实现无关。当我们要针对某个目标进行分析时,作为起点,总是尝试在此文件中找到对应的目标定义,然后沿着该定义深入挖掘。
      • .config:uboot 配置文件,如果是内核,就是内核的配置文件,在配置 uboot时候生成,所有的 Makefile 文件(包括顶层目录及各级子目录)都是根据 .config 来决定使用哪些文件。
      • arch/$(ARCH)/Makefile:平台相关 Makefile,提供针对不同架构的目标,变量和规则定义。文件位置比较固定
      • scripts/Makefile.*:Makefile 共用的通用规则、脚本等
      • kbuild Makefiles:各级子目录下的  Makefile,相对简单,被上一层 Makefile 调用来编译当前目录下的文件。

      顶层 Makefiles 读取从uboot 配置程序中生成的 .config 文件  

    1.3.2 文件关联

      在上述的所有文件中,除了顶层的  Makefile,其他文件都或直接、或间接的和 它相关联。这些关联可以分为两类:

    (1)直接包含

      在一个文件中,用  include 来包含另外的文件

    (2)间接包含

      使用 make -f 来调用,-f 是使用不同的  makefile 文件来进行 make 的选项。

    1.4 make xxx_defconfig 命令执行分析

      由于 2018.03 的 uboot 版本中已经遗弃了 2440 所以我们选择一块其他开发板进行分析。

      执行命令:make smdkc100_defconfig V=1

      V = 1 的意思是打开编译过程

      过程如下:

    复制代码
    复制代码
     1 make -f ./scripts/Makefile.build obj=scripts/basic
     2   cc -Wp,-MD,scripts/basic/.fixdep.d -Wall -Wstrict-prototypes -O2 -fomit-frame-pointer      -o scripts/basic/fixdep scripts/basic/fixdep.c  
     3 rm -f .tmp_quiet_recordmcount
     4 make -f ./scripts/Makefile.build obj=scripts/kconfig smdkc100_defconfig
     5   cc -Wp,-MD,scripts/kconfig/.conf.o.d -Wall -Wstrict-prototypes -O2 -fomit-frame-pointer    -D_GNU_SOURCE -DCURSES_LOC="<ncurses.h>" -DLOCALE   -c -o scripts/kconfig/conf.o scripts/kconfig/conf.c
     6   cat scripts/kconfig/zconf.tab.c_shipped > scripts/kconfig/zconf.tab.c
     7   cat scripts/kconfig/zconf.lex.c_shipped > scripts/kconfig/zconf.lex.c
     8   cat scripts/kconfig/zconf.hash.c_shipped > scripts/kconfig/zconf.hash.c
     9   cc -Wp,-MD,scripts/kconfig/.zconf.tab.o.d -Wall -Wstrict-prototypes -O2 -fomit-frame-pointer    -D_GNU_SOURCE -DCURSES_LOC="<ncurses.h>" -DLOCALE  -Iscripts/kconfig -c -o scripts/kconfig/zconf.tab.o scripts/kconfig/zconf.tab.c
    10   cc  -o scripts/kconfig/conf scripts/kconfig/conf.o scripts/kconfig/zconf.tab.o  
    11 scripts/kconfig/conf  --defconfig=arch/../configs/smdkc100_defconfig Kconfig
    12 #
    13 # configuration written to .config
    14 #
    复制代码
    复制代码

      

      这一项是生成了 scripts/basic/fixdep 工具

      

      这一项是生成了 scripts/kconfig/conf 工具

      

      最后执行 scripts/kconfig/conf 工具 生成.config

       可以知道 make xxx_defconfig 的执行主要分成三个部分:

    1. 执行 make -f ./scripts/Makefile.build obj=scripts/basic,编译生成 scripts/basic/fixdep 工具
    2. 执行 make -f ./scripts/Makefile.build obj=scripts/kconfig rpi_3_32b_defconfig 编译生成 scripts/kconfig/conf 工具
    3. 执行 scripts/kconfig/conf --defconfig=arch/../configs/xxx_defconfig Kconfig生成最终的 .config 配置文件
  • 相关阅读:
    Arthas 使用的各类方式
    1小时打造HaaS版小小蛮驴智能车
    Serverless 场景下 Pod 创建效率优化
    .net程序员的盲点(八):泛型
    altas(ajax)控件(五):日历控件Calendar
    altas(ajax)控件(六):CascadingDropDown 联动选择的下拉框
    altas(ajax)控件(二):悬浮面板控件AlwaysVisibleControl
    altas(ajax)控件(八):ConfirmButton确认对话框
    altas(ajax)控件(九):可拖动面板DragPanel
    altas(ajax)控件(三):动画制作控件AnimationExtender
  • 原文地址:https://www.cnblogs.com/bully/p/9049224.html
Copyright © 2011-2022 走看看