当前位置: 首页 > news >正文

imx6ull-系统移植篇4——U-Boot 工程目录分析

前言

我们使用正点原子imx6ull开发板,分析一遍 uboot的启动流程源码,搞清楚uboot 的启动流程,以后就可以移植 uboot 到自己的开发板上了。

但是U-Boot源码那么庞大,从哪开始呢?先让我们来分析一下U-Boot 源码的工程目录吧。

U-Boot 工程目录

我们在分析 uboot 源码之前,一定要先在 Ubuntu 中编译一下 uboot 源码,因为编译过程会生成一些文件,而生成的这些恰恰是分析uboot 源码不可或缺的文件。

编译后的 uboot 源码文件如下:

以下是U-Boot源码目录结构的详细分析,按功能分类说明:

​核心功能目录​

  1. ​​arch/ ​​“架构相关代码,按CPU架构分类(如arm/、x86/)。包含启动流程、中断处理、时钟初始化等底层代码。例如:arm/cpu/armv7/start.S:ARMv7架构的启动汇编代码。
  2. ​​board/​​:开发板专属支持代码,按厂商/型号分类(如freescale/mx6ullevk/)。包含板级初始化、内存布局、GPIO配置等。
  3. ​​drivers/​​:设备驱动代码,涵盖串口、MMC、USB、网卡等硬件驱动。例如:drivers/mmc/mmc.c:MMC/SD卡驱动核心逻辑。
  4. ​​cmd/​​:命令行命令实现,每个文件对应一个命令(如bootm.c实现bootm命令)。命令通过U_BOOT_CMD宏注册。
  5. ​​common/​​:通用功能代码,如环境变量处理(env_*.c)、启动逻辑(bootm.c)、命令行解析等。
  6. ​​include/​​:全局头文件,包括架构头文件(asm/)、配置宏(configs/)、协议定义(如linux/bitops.h)。

构建与配置

  1. configs/ 预置的配置文件(如mx6ull_alientek_emmc_defconfig),通过make xxx_defconfig生成.con​​fig。
  2. ​​scripts/​​ 构建脚本和工具,如mkimage(生成镜像)、dtc(设备树编译)、Kconfig解析脚本。
  3. ​​Kconfig / Makefile​​顶层构建规则。Kconfig定义配置选项(通过make menuconfig修改),Makefile控制编译流程。
  4. ​​.config​​ 当前编译配置缓存文件,由make xxx_defconfig生成,决定功能模块的编译开关。

辅助功能目录

  1. dts/​​ 设备树源文件(.dts)和编译工具,描述硬件拓扑结构,替代旧版的硬编码配置。
  2. ​​fs/​​ 文件系统支持(FAT、EXT4、JFFS2等),用于从存储设备加载内核或数据。
  3. ​​net/ ​​网络协议栈(TFTP、NFS、Ping等)及网络驱动(如eth.c)。
  4. ​​lib/​​ 通用库函数(字符串操作、CRC校验、压缩算法等)。
  5. ​​test/ ​​单元测试代码,验证核心功能(如cmd_ut测试命令行)。

文档与许可

  1. doc/​​ 使用文档(如README.distro说明启动流程)、API参考。
  2. ​​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 的认识。

http://www.dtcms.com/a/278358.html

相关文章:

  • ubuntu之坑(十八)——XML相关
  • 【机器学习深度学习】Ollama vs vLLM vs LMDeploy:三大本地部署框架深度对比解析
  • MIPI DSI (一) MIPI DSI 联盟概述
  • 智能Agent场景实战指南 Day 12:医疗咨询Agent设计模式
  • Python与MongoDB深度整合:异步操作与GridFS实战指南
  • Apache-web服务器环境搭建
  • 前端开发中的常见问题及解决方案
  • 前端基础之《Vue(22)—安装MongoDB》
  • Python+MongoDB高效开发组合
  • mongodb原理及其实现
  • MongoDB从入门到精通
  • HarmonyOS从入门到精通:动画设计与实现之九 - 实用动画案例详解(下)
  • 第十八篇 数据清洗:Python智能筛选与统计:从海量Excel数据中秒级挖掘,辅助决策!你的数据分析利器!
  • ResizeObserver 深入全面讲解
  • C++类与对象(上)
  • 迅为八核高算力RK3576开发板摄像头实时推理测试 ppyoloe目标检测
  • 视频动态范围技术演进:从SDR到HDR的影像革命
  • 模型篇(Bert llama deepseek)
  • 视频推荐模型代码解析(马栏山芒果TV算法大赛)
  • 从代码学习深度学习 - 自然语言推断:微调BERT PyTorch版
  • Cesium 9 ,Cesium 离线地图本地实现与服务器部署( Vue + Cesium 多项目共享离线地图切片部署实践 )
  • H264的帧内编码和帧间编码
  • 2025年睿抗机器人开发者大赛CAIP-编程技能赛本科组(省赛)解题报告 | 珂学家
  • Python 变量与简单输入输出:从零开始写你的第一个交互程序
  • 【Java入门到精通】(四)Java语法进阶
  • 动手学深度学习——线性回归的从零开始实现
  • 【记录】BLE|百度的旧蓝牙随身音箱手机能配对不能连接、电脑能连接不能使用的解决思路(Wireshark捕获并分析手机蓝牙报文)
  • 1.2.2 高级特性详解——AI教你学Django
  • 【图片识别改名】水印相机拍的照片如何将照片的名字批量改为水印内容?图片识别改名的详细步骤和注意事项
  • 【WPF】WPF 自定义控件 实战详解,含命令实现