imx6ull-系统移植篇4——U-Boot 工程目录分析
前言
我们使用正点原子imx6ull开发板,分析一遍 uboot的启动流程源码,搞清楚uboot 的启动流程,以后就可以移植 uboot 到自己的开发板上了。
但是U-Boot源码那么庞大,从哪开始呢?先让我们来分析一下U-Boot 源码的工程目录吧。
U-Boot 工程目录
我们在分析 uboot 源码之前,一定要先在 Ubuntu 中编译一下 uboot 源码,因为编译过程会生成一些文件,而生成的这些恰恰是分析uboot 源码不可或缺的文件。
编译后的 uboot 源码文件如下:
以下是U-Boot源码目录结构的详细分析,按功能分类说明:
核心功能目录
- arch/ “架构相关代码,按CPU架构分类(如arm/、x86/)。包含启动流程、中断处理、时钟初始化等底层代码。例如:arm/cpu/armv7/start.S:ARMv7架构的启动汇编代码。
- board/:开发板专属支持代码,按厂商/型号分类(如freescale/mx6ullevk/)。包含板级初始化、内存布局、GPIO配置等。
- drivers/:设备驱动代码,涵盖串口、MMC、USB、网卡等硬件驱动。例如:drivers/mmc/mmc.c:MMC/SD卡驱动核心逻辑。
- cmd/:命令行命令实现,每个文件对应一个命令(如bootm.c实现bootm命令)。命令通过U_BOOT_CMD宏注册。
- common/:通用功能代码,如环境变量处理(env_*.c)、启动逻辑(bootm.c)、命令行解析等。
- include/:全局头文件,包括架构头文件(asm/)、配置宏(configs/)、协议定义(如linux/bitops.h)。
构建与配置
- configs/ 预置的配置文件(如mx6ull_alientek_emmc_defconfig),通过make xxx_defconfig生成.config。
- scripts/ 构建脚本和工具,如mkimage(生成镜像)、dtc(设备树编译)、Kconfig解析脚本。
- Kconfig / Makefile顶层构建规则。Kconfig定义配置选项(通过make menuconfig修改),Makefile控制编译流程。
- .config 当前编译配置缓存文件,由make xxx_defconfig生成,决定功能模块的编译开关。
辅助功能目录
- dts/ 设备树源文件(.dts)和编译工具,描述硬件拓扑结构,替代旧版的硬编码配置。
- fs/ 文件系统支持(FAT、EXT4、JFFS2等),用于从存储设备加载内核或数据。
- net/ 网络协议栈(TFTP、NFS、Ping等)及网络驱动(如eth.c)。
- lib/ 通用库函数(字符串操作、CRC校验、压缩算法等)。
- test/ 单元测试代码,验证核心功能(如cmd_ut测试命令行)。
文档与许可
- doc/ 使用文档(如README.distro说明启动流程)、API参考。
- Licenses/ 开源许可证文本(GPL、BSD等),合规性检查时使用。
生成文件说明
u-boot:编译出来的 ELF 格式的 uboot 镜像文件。
u-boot.bin:编译出来的二进制格式的 uboot 可执行镜像文件。u-boot.cfg: uboot 的另外一种配置文件。
- u-boot.imx: u-boot.bin 添加头部信息以后的文件, NXP 的 CPU 专用文件。u-boot.lds:链接脚本。
- u-boot.map: uboot 映射文件,通过查看此文件可以知道某个函数被链接到了哪个地址上
- u-boot.srec: S-Record 格式的镜像文件。
- u-boot.sym: uboot 符号文件。
- u-boot-nodtb.bin:和 u-boot.bin 一样, u-boot.bin 就是 u-boot-nodtb.bin 的复制文件。
System.map:符号地址映射表,用于调试。
关键文件示例
MAINTAINERS:维护者列表,标注模块负责人。
README:项目概述和编译指南。
mx6ull_alientek_emmc.sh:针对特定开发板的烧写脚本。
关键文件分析
arch文件夹
I.MX6ULL 使用的 Cortex-A7 内核, Cortex-A7 属于 armv7,所以我们要关心“armv7”这个文件夹。
cpu 文件夹里面有个名为“uboot.lds”的链接脚本文件,这个就是 ARM 芯片所使用的 u-boot 链接脚本文件:
board 文件夹
borad 文件夹里面有个名为“freescale”的文件夹,再找mx6ullevk 文件夹,mx6ullevk是 NXP官方的I.MX6ULL 开发板,正点原子的ALPHA开发板就是在这个基础上开发的。
configs 文件夹
下图里这6 个文件就是正点原子 I.MX6U-ALPHA 开发板所对应的 uboot 默认配置文件。
我们只关心 mx6ull_14x14_ddr512_emmc_defconfig 和 mx6ull_14x14_ddr256_nand_defconfig这两个文件,分别是正点原子 I.MX6ULL EMMC 核心板和 NAND 核心板的配置文件。
使用“make xxx_defconfig”命令即可配置 uboot,比如:
make mx6ull_14x14_ddr512_emmc_defconfig
makefile文件
这个是顶层 Makefile 文件, Makefile 是支持嵌套的,也就是顶层 Makefile 可以调用子目录中的 Makefile 文件。
大项目里,各个功能模块的源代码都是分开的,各自存放在各自的目录中。每个功能模块目录下都有一个 Makefile,这个 Makefile 只处理本模块的编译链接工作
uboot 源码根目录下的 Makefile 是顶层 Makefile,他会调用其它的模块的 Makefile 文件,比如 drivers/adc/Makefile。
.config 文件
uboot 配置文件,使用命令“make xxx_defconfig”配置 uboot 以后就会自动生成。
.config 文件中都是以“CONFIG_”开始的配置项,这些配置项就是 Makefile 中的变量,因此后面都跟有相应的值, uboot 的顶层 Makefile 或子 Makefile 会调用这些变量值。
在.config 中会有大量的变量值为‘y’,这些为‘y’的变量一般用于控制某项功能是否使能,比如:
CONFIG_CMD_BOOTM=y
相当于通过“CONFIG_CMD_BOOTD=y”来使能 bootm 这个命令,进而编译 cmd/bootm.c 这个文件,这个文件实现了命令 bootm。在 uboot 和 Linux 内核中都是采用这种方法来选择使能某个功能,编译对应的源码文件。
README
README 文件描述了 uboot 的详细信息,包括 uboot 该如何编译、 uboot 中各文件夹的含义、相应的命令等等。
大家空了的时候可以详细地阅读此文件,可以进一步增加对 uboot 的认识。