logo资料库

uboot_2020_04.pdf

第1页 / 共238页
第2页 / 共238页
第3页 / 共238页
第4页 / 共238页
第5页 / 共238页
第6页 / 共238页
第7页 / 共238页
第8页 / 共238页
资料共238页,剩余部分请下载后查看
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,也可以选择其他
分享到:
收藏