uboot
一、uboot 介绍
1.1 使用的版本
uboot 的版本尽量选择最适合的,并不一定是最新的版本最好,最新的版本也许会使移植
工作加大。
当前选择的版本时 2020.04 版本。
1.2 常用命令
当前 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 编译一样,分两步执行:
boot.elf
- 第一步:配置,执行 make xxx_defconfig 进行各项配置,生成.config 文件
- 第二部:编译,执行 make 进行编译,生成可执行的二进制文件 u-boot.bin 或 u-
1.3 Linux 内核构建系统所支持的目标
make targets,targets 就是我们前述的那些命令,我们可以通过 make help 打印出来内核构
建系统所支持的目标完整列表。
如下所示,是 make help 所打印的所有目标:
⚫ clean 目标
◼ clean:清除大多数生成的文件,但是保留配置
◼ mrproper:清除所有生成的文件、配置文件和各种备份文件
◼ distclean:此项就是 mrproper 的升级版本,多加了清除备份和补丁文件
⚫ 配置项目标:
xconfig:利用基于 Qt 的前端更新当前配置
◼ config:利用命令行更新当前配置
◼ nconfig:使用基于 ncurses 菜单的程序更新当前配置
◼ menuconfig:利用菜单程序更新当前配置
◼
◼ gconfig:利用基于 GTK +的前端更新当前配置
◼ oldconfig:使用提供的.config 作为基础更新当前配置
◼
◼
◼
◼ defconfig:来自 ARCH 的默认配置提供了 defconfig
◼
◼ allnoconfig:新的配置,所有选项的答案都是 no
◼ allyesconfig:新的配置,所有选项的答案都是 yes
◼ allmodconfig:新的配置,尽可能的选择模块
localmodconfig:更新当前配置禁用未加载的模块
localyesconfig:更新当前配置将本地 mods 转换为 core
silentoldconfig:与 oldconfig 相同,但是安静地更新 deps
savedefconfig:保存当前配置为./defconfig(最小配置)
◼ alldefconfig:将所有符号设置为默认值的新配置
randconfig:对所有选项进行随机答案的新配置
◼
listnewconfig:列出新选项
◼
◼ olddefconfig:与 silentoldconfig 相同,但是对默认值设置新的符号
⚫ 其他通用目标
tests:为 sandbox 构建 U-Boot,并测试
◼ all:根据配置构建所有必要的镜像
◼
◼ 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.4 构建系统的文件
1.4.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.4.2 文件关联
在上述的所有文件中,除了顶层的 Makefile,其他文件都或直接、或间接的和 它相关
联。这些关联可以分为两类:
⚫ 直接包含
◼ 在一个文件中,用 include 来包含另外的文件
⚫ 间接包含
◼ 使用 make -f 来调用,-f 是使用不同的 makefile 文件来进行 make 的选项。
1.4.3 关于 .config 与 include/configs 下的配置文件
这两个文件是属于不同目录下的配置文件,每一块板子的配置都包括两个部分的配置,一
部分是 include/configs 下的配置,另一个部分就是 .config 文件。
.configs 文件会在编译的的时候通过配置工具 Kconfig 生成为 autoconf.h 文件,然后,
autoconf.h 文件再被其他文件包含,那么编译的时候就可以根据不同的配置宏来选择不同
的代码了。
这里有个问题,autoconf.h 文件和 include/confjgs 文件谁先被包含的问题。以 jz2440.h
为例子,大概的文件顺序如下:
这个顺序说明了,jz2440.h 的配置处在第一顺位,然后才是 autoconf.h 文件,这就说明
了一个问题,我们在移植一些配置进入 Kconfig 的时候需要小心,加入定义了一个宏
CONFIG_A 和 CONFIG_B,CONFIG_B 依赖 CONFIG_A 的值,就像 :
#define CONFIG_B
CONFIG_A
如果将 CONFIG_A 定义在了 menuconfig 中,那么是 CONFIG_B 的值一定是空,因为
CONFIG_A 在后面才被定义。
二、 交叉编译工具链制作
2.1 环境
软件工具:crosstool-ng
下载地址:git clone https://github.com/crosstool-ng/crosstool-ng
选择一个合适的 release 版本下载,下载完成后,拷贝进虚拟机进行解压。
需要的软件有:sudo apt-get install gperf bison flex texinfo help2man gawk libncurses5-
dev autoconf libtool-bin
进入 crosstool-ng 目录,执行./bootstrap,生成 configure 执行文件
执行配置 ./configure --prefix=`pwd`/crosstool,检查安装环境,报什么错,
就安装什么软件.
执行命令 make 执行命令:
make install
export PATH=”${PATH}:`pwd`/crosstool/bin”
源包下载地址:
⚫ 内核下载:https://mirrors.edge.kernel.org/pub/linux
⚫ dtc 下载:https://git.kernel.org/pub/scm/utils/dtc/dtc.git/
⚫
⚫
⚫ expat 下载:
isl 下载:http://isl.gforge.inria.fr
libelf 下载:https://fossies.org/linux/misc/old/
https://sourceforge.net/p/expat/activity/?page=0&limit=100#5d7c14e6e8ba7c5f33226
9ff
ltrace 下载:http://ftp.debian.org/debian/pool/main/l/ltrace/
strace 下载:https://strace.io/files/
⚫ duma 下载:https://sourceforge.net/projects/duma/files/
⚫
⚫
⚫ zlib 下载:https://sourceforge.net/projects/libpng/files/zlib/
⚫ 其他工具:http://mirrors.ibiblio.org/gnu/ftp/gnu
2.2 配置
在工作目录下建立三个文件夹:mkdir src x-tools crosstool
进入 crosstool 目录:cd ~/tools/toolchain/crosstool,执行命令 ct-ng list-samples
选择 arm-unknown-linux-gnueabi 作为交差编译工具链的模版
执行命令:ct-ng show-arm-unknown-linux-gnueabi,查看编译交差编译工具链所需要的
配置:
执行命令:ct-ng menuconfig
⚫ Paths and misc options:路径和杂项选择
◼ Use obsolete features:如果将此设置为 Y,则可以选择过时的功能。这些过时的
特性是使用旧的内核头,旧的 gcc 版本等。
◼ Try features marked as EXPERIMENTAL:如果将此设置为 Y,则可以尝试实验性
的功能。
◼ Debug crosstool-NG:调试功能
◼ Local tarballs directory:如果以前下载过 tar 包,可以在此处设置 tar 包的路
径。将此处设置为我们建立的 src 文件夹,${HOME}/tools/toolchain/src
◼ Save new tarballs:如果选择 Y,下载下来的包将保存在 Local tarballs directory
设置的路径中。默认是 Y
◼ Prefer buildroot-style layout of the downloads:Buildroot 将其下载目录的布局切
换为将每个包的文件放入以该包命名的子目录中。启用此选项可以让 crosstool
NG 创建类似的布局。如果设置了此选项,并且所需的存档文件位于具有传统平
面布局的目录中,则存档文件将移动到子目录中。如果未设置此选项,则子目录
既不会被选中,也不会用于存储下载。选择 Y
◼ Working directory:将此设置为将执行所有生成操作的目录,保持默认。
◼ Prefix directory:指定交叉编译器的安装路径,根据自己情况修改为:
${HOME}/tools/toolchain/x-tools/s3c2440。
◼ Remove the prefix dir prior to building:如果你在这里说“y”,那么在构建工具链
之前,PREFIX_DIR(上面)将被删除。
◼ Remove documentation:删除已安装的文档(手册页和信息页)。基于
UCLBC、C 和 C++编译器的增益大约为 8MIB
◼ Build the manuals:为主要组件(如 binutils、GCC、GDB 和 C 库)构建 PDF 和
HTML 手册。最好不要开
Install licenses:liscense 安装,默认即可。
◼
◼ Render the toolchain read-only:将工具链的目录(及其子目录)呈现为只读。
默认即可。
◼ Strip host toolchain executables:所有生成主机可执行文件都包含许多不必要的
信息。通过剥离主机可执行文件,它稍微加快了大型项目的编译速度。默认
◼ Strip target toolchain executables:这意味着使用 GCC4.6 或更高版本的安装条目
标。提供了一个 install strip make 目标,用于安装剥离的可执行文件,并且可以
安装不需要的库或剥离了调试部分的库。有需要可以选上,一般默认。
◼ Download agent:下载工具,默认是 wget,也可以选择其他