U-Boot详解(一)

📅 2026/7/18 3:58:33
U-Boot详解(一)
uboot 目录列表类型名字描述备注文件夹api与硬件无关的 API 函数uboot 自带arch与架构体系有关的代码board不同板子(开发板)的定制代码cmd命令相关代码common通用代码configs配置文件disk磁盘分区相关代码doc文档drivers驱动代码dts设备树examples示例代码fs文件系统include头文件lib库文件Licenses许可证相关文件net网络相关代码post上电自检程序scripts脚本文件test测试代码tools工具文件夹文件.config配置文件重要的文件编译生成的文件.gitignoregit 工具相关文件uboot 自带.mailmap邮件列表.u-boot.xxx.cmd一系列这是一系列的文件用于保存着一些命令编译生成的文件config.mk某个 Makefile 会调用此文件uboot 自带Kbuild用于生成一些和汇编有关的文件uboot 自带Kconfig图形配置界面描述文件MAINTAINERS维护者联系方式文件MAKEALL一个 shell 脚本文件帮助编译 uboot 的Makefile主 Makefile重要文件README相当于帮助文档uboot 自带snapshot.commintSystem.map系统映射文件编译出来的文件u-boot编译出来的 u-boot 文件u-boot.xxx一系列生成的一些 u-boot 相关文件包括 u-boot.bin、u-boot.imx 等上表中的很多文件夹和文件我们都不需要去关心我们要关注的文件夹或文件如下1、arch文件夹这个文件夹里面存放着和架构有关的文件如下图所示从图中可以看出有很多架构比如arm、avr32、m68k等若我们用的是ARM芯片则只需要关心 arm文件夹即可打开arm文件夹里面内容如图所示图中只截取了一部分还有一部分mach-xxx的文件夹。mach开头的文件夹是跟具体的设备有关的比如“mach-exynos”就是跟三星的exyons系列CPU 有关的文件。另外“cpu”这个文件夹也是和cpu架构有关的打开以后如下图所示从上图可以看出有多种ARM 架构相关的文件夹。cpu文件夹里面有个名为“u-boot.lds”的链接脚本文件这个就是 ARM芯片所使用的u-boot链接脚本文件armv7这个文件夹里面的文件都是跟 ARMV7架构有关的。2、board文件夹board 文件夹就是和具体的板子有关的打开此文件夹里面全是不同的板子。borad 文件夹里面有个名为“freescale”的文件夹所有使用freescale 芯片的板子都放到此文件夹中。打开此 freescale文件夹在里面找到和mx6u(I.MX6UL/ULL)有关的文件夹如图所示图中有5个文件夹这5个文件夹对应5种板子以“mx6ul”开头的表示使用I.MX6UL 芯片的板子以mx6ull开头的表示使用I.MX6ULL 芯片的板子。mx6ullevk 是NXP 官方的 I.MX6ULL 开发板移植I.MX6ULL 开发板的 uboot 要参考 mx6ullevk 这个文件夹来定义我们的板子。3、configs文件夹此文件夹为uboot配置文件uboot 是可配置的但是我们要是自己从头开始一个一个项目的配置那就太麻烦了因此一般半导体或者开发板厂商都会制作好一个配置文件。我们可以在这个做好的配置文件基础上来添加自己想要的功能这些半导体厂商或者开发板厂商制作好的配置文件统一命名为“xxx_defconfig”xxx表示开发板名字这些defconfig文件都存放在configs 文件夹如图所示使用“make xxx_defconfig”命令即可配置uboot比如make mx6ull_14x14_ddr512_emmc_defconfig在编译uboot之前一定要使用defconfig来配置uboot4、.u-boot.xxx_cmd文件.u-boot.xxx_cmd是一系列的文件这些文件都是编译生成的都是一些命令文件比如文件.u-boot.bin.cmd看名字应该是和u-boot.bin有关的此文件的内容如下cmd_u-boot.bin:cp u-boot-nodtb.bin u-boot.bin.u-boot.bin.cmd里面定义了一个变量cmd_u-boot.bin此变量的值为“cp u-boot-nodtb.bin u-boot.bin”也就是拷贝一份u-boot-nodtb.bin文件并且重命名为u-boot.bin这个就是u-boot.bin 的来源来自于文件u-boot-nodtb.bin。那么u-boot-nodtb.bin是怎么来的呢文件.u-boot-nodtb.bin.cmd就是用于生成u-boot.nodtb.bin 的此文件内容如下cmd_u-boot-nodtb.bin:arm-linux-gnueabihf-objcopy --gap-fill0xff -j .text -j .secure_text -j .rodata -j .hash -j .data -j .got -j .got.plt -j .u_boot_list -j .rel.dyn-O binary u-boot u-boot-nodtb.bin这里用到了arm-linux-gnueabihf-objcopy使用objcopy将ELF格式的u-boot文件转换为二进制的 u-boot-nodtb.bin文件。文件u-boot是ELF格式的文件文件.u-boot.cmd用于生成u-boot文件内容如下cmd_u-boot : arm-linux-gnueabihf-ld.bfd -pie --gc-sections -Bstatic -Ttext 0x87800000 -o u-boot -T u-boot.lds arch/arm/cpu/armv7/start.o - -start-group arch/arm/cpu/built-in.o arch/arm/cpu/armv7/built-in.o a rch/arm/imx-common/built-in.o arch/arm/lib/built-in.o board/freescal e/common/built-in.o board/freescale/mx6ull_alientek_emmc/built-in.o cmd/built-in.o common/built-in.o disk/built-in.o drivers/built-in.o drivers/dma/built-in.o drivers/gpio/built-in.o drivers/i2c/built-i n.o drivers/mmc/built-in.o drivers/mtd/built-in.o drivers/mtd/onenan d/built-in.o drivers/mtd/spi/built-in.o drivers/net/built-in.o drive rs/net/phy/built-in.o drivers/pci/built-in.o drivers/power/built-in. o drivers/power/battery/built-in.o drivers/power/fuel_gauge/built-i n.o drivers/power/mfd/built-in.o drivers/power/pmic/built-in.o drive rs/power/regulator/built-in.o drivers/serial/built-in.o drivers/spi/ built-in.o drivers/usb/dwc3/built-in.o drivers/usb/emul/built-in.o d rivers/usb/eth/built-in.o drivers/usb/gadget/built-in.o drivers/usb/ gadget/udc/built-in.o drivers/usb/host/built-in.o drivers/usb/musb-n ew/built-in.o drivers/usb/musb/built-in.o drivers/usb/phy/built-in.o drivers/usb/ulpi/built-in.o fs/built-in.o lib/built-in.o net/built -in.o test/built-in.o test/dm/built-in.o --end-group arch/arm/lib/eab i_compat.o -L /usr/local/arm/gcc-linaro-4.9.4-2017.01-x86_64_arm-linu x-gnueabihf/bin/../lib/gcc/arm-linux-gnueabihf/4.9.4 -lgcc -Map u-boo t.map.u-boot.cmd使用到了arm-linux-gnueabihf-ld.bfd也就是链接工具使用ld.bfd将各个built-in.o 文件链接在一起就形成了u-boot文件。uboot在编译的时候会将同一个目录中的所有.c文件都编译在一起并命名为 built-in.o相当于将众多的.c文件对应的.o文件集合在一起这个就是 u-boot文件的来源。如果我们要用NXP提供的MFGTools工具向开发板烧写uboot此时烧写的是u-boot.imx 文件而不是 u-boot.bin文件。u-boot.imx是在u-boot.bin文件的头部添加了IVT、DCD等信息。这个工作是由文件.u-boot.imx.cmd来完成的此文件内容如下cmd_u-boot.imx : ./tools/mkimage -n board/freescale/mx6ull_alientek_emmc/imximage.cfg.cfgtmp -T imximage -e 0x87800000 -d u-boot.bin u-boot.imx可以看出这里用到了工具tools/mkimage而IVT、DCD等数据保存在了文件 board/freescale/mx6ullevk/imximage-ddr512.cfg.cfgtmp 中工具mkimage就是读取文件imximage-ddr512.cfg.cfgtmp 里面的信息然后将其添加到文件 u-boot.bin的头部最终生成u-boot.imx。文件.u-boot.lds.cmd就是用于生成u-boot.lds链接脚本的由于.u-boot.lds.cmd文件内容太多这里就不列出来了。uboot根目录下的u-boot.lds链接脚本就是来源于arch/arm/cpu/u-boot.lds 文件。5、Makefile文件这个是顶层 Makefile 文件Makefile 是支持嵌套的也就是顶层 Makefile 可以调用子目录中的 Makefile 文件。Makefile 嵌套在大项目中很常见一般大项目里面所有的源代码都不会放到同一个目录中各个功能模块的源代码都是分开的各自存放在各自的目录中。每个功能模块目录下都有一个 Makefile这个 Makefile 只处理本模块的编译链接工作这样所有的编译链接工作就不用全部放到一个 Makefile 中可以使得 Makefile 变得简洁明了。uboot 源码根目录下的 Makefile 是顶层 Makefile他会调用其它的模块的 Makefile 文件比如 drivers/adc/Makefile。6、u-boot.xxx文件u-boot.xxx 同样也是一系列文件包括 u-boot、u-boot.bin、u-boot.cfg、u-boot.imx、u-boot.lds、u-boot.map、u-boot.srec、u-boot.sym 和 u-boot-nodtb.bin这些文件的含义如下u-boot编译出来的 ELF 格式的 uboot 镜像文件。u-boot.bin编译出来的二进制格式的 uboot 可执行镜像文件。u-boot.cfguboot 的另外一种配置文件。u-boot.imxu-boot.bin 添加头部信息以后的文件NXP 的 CPU 专用文件。u-boot.lds链接脚本。u-boot.mapuboot 映射文件通过查看此文件可以知道某个函数被链接到了哪个地址上。u-boot.srecS-Record 格式的镜像文件。u-boot.symuboot 符号文件。u-boot-nodtb.bin和 u-boot.bin 一样u-boot.bin 就是 u-boot-nodtb.bin 的复制文件。7、.config文件uboot 配置文件使用命令make xxx_defconfig配置 uboot 以后就会自动生成.config 内容如下# # Automatically generated file; DO NOT EDIT. # U-Boot 2016.03 Configuration # CONFIG_CREATE_ARCH_SYMLINKy CONFIG_HAVE_GENERIC_BOARDy CONFIG_SYS_GENERIC_BOARDy # CONFIG_ARC is not set CONFIG_ARMy # CONFIG_AVR32 is not set # CONFIG_BLACKFIN is not set CONFIG_M68K is not set CONFIG_MICROBLAZE is not set CONFIG_MIPS is not set CONFIG_NDS32 is not set CONFIG_NIOS2 is not set CONFIG_OPENRISC is not set CONFIG_PPC is not set CONFIG_SANDBOX is not set CONFIG_SH is not set CONFIG_SPARC is not set CONFIG_X86 is not set CONFIG_SYS_ARCHarm CONFIG_SYS_CPUarmv7 CONFIG_SYS_SOCmx6 CONFIG_SYS_VENDORfreescale CONFIG_SYS_BOARDmx6ull_alientek_emmc CONFIG_SYS_CONFIG_NAMEmx6ull_alientek_emmc ...... Boot commands CONFIG_CMD_BOOTDy CONFIG_CMD_BOOTMy CONFIG_CMD_ELFy CONFIG_CMD_XIMGy Environment commands CONFIG_CMD_EXPORTENVy CONFIG_CMD_IMPORTENVy CONFIG_CMD_EDITENVy CONFIG_CMD_SAVEENVy CONFIG_CMD_ENV_EXISTSy ...... Library routines CONFIG_CC_OPTIMIZE_LIBS_FOR_SPEED is not set CONFIG_HAVE_PRIVATE_LIBGCCy CONFIG_USE_PRIVATE_LIBGCC is not set CONFIG_SYS_HZ1000 CONFIG_USE_TINY_PRINTF is not set CONFIG_REGEXy可以看出.config文件中都是以“CONFIG_”开始的配置项这些配置项就是Makefile中的变量因此后面都跟有相应的值uboot的顶层Makefile或子Makefile会调用这些变量值。在.config 中会有大量的变量值为‘y’这些为‘y’的变量一般用于控制某项功能是否使能为‘y’ 的话就表示功能使能比如CONFIG_CMD_BOOTMy如果使能了bootd这个命令的话CONFIG_CMD_BOOTM就为‘y’。在cmd/Makefile中有如下代码ifndef CONFIG_SPL_BUILD # core command obj-y boot.o obj-$(CONFIG_CMD_BOOTM) bootm.o obj-y help.o obj-y version.o在示例代码中有如下所示一行代码obj-$(CONFIG_CMD_BOOTM) bootm.oCONFIG_CMD_BOOTMy将其展开就是obj-y bootm.o也就是给 obj-y 追加了一个bootm.oobj-y 包含着所有要编译的文件对应的.o 文件这里表示需要编译文件 cmd/bootm.c。相当于通过CONFIG_CMD_BOOTDy来使能 bootm 这个命令进而编译 cmd/bootm.c 这个文件这个文件实现了命令 bootm。在 uboot 和 Linux 内核中都是采用这种方法来选择使能某个功能编译对应的源码文件。觉得有帮助的话打赏一下呗。。