一、概念
U‑Boot 是 bootloader 的一种,作用:内核加载前初始化硬件,为Linux内核提供引导功能。
i.MX6ULL 上电启动链路:芯片上电 → 片内ROM → U‑Boot第一阶段 → U‑Boot第二阶段 → Linux内核 分两阶段原因:片内RAM(OCRAM)仅128KB,放不下完整U‑Boot镜像。
完整启动流程
- 上电复位,运行芯片iROM固化代码
- 读取启动设备(SD/EMMC/NAND/QSPI),把
uboot.imx前4KB加载到片内RAM0x00900000 - 执行U‑Boot第一阶段(IVT+DCD+BOOT_DTAT):初始化DDR、时钟、引脚
- 将完整
u‑boot.img加载到DDR0x87800000 - 运行U‑Boot第二阶段主程序:初始化外设、读取环境变量、解析启动命令
- 将Linux内核zImage+设备树dtb加载到DDR,启动内核
启动3个阶段解析
- 阶段1:Boot ROM(芯片固化,不属于U‑Boot)
- 根据拨码识别启动模式;初始化基础时钟;读取
uboot.imx头部;加载头部到OCRAM。
- 根据拨码识别启动模式;初始化基础时钟;读取
- 阶段2:U‑Boot第一阶段 SPL,运行于片内OCRAM
- 关闭看门狗,配置CPU时钟,引脚复用;初始化DDR控制器;完整初始化存储设备;把完整U‑Boot拷贝到DDR;跳转到DDR执行。
u‑boot.imx = IVT + BootData + DCD + u‑boot.bin
- 阶段3:U‑Boot第二阶段(主程序,DDR 0x87800000,命令行交互)
- 初始化DDR、时钟、存储外设;加载内核+设备树;传递启动参数;启动Linux内核。
二、U‑Boot常用命令&环境变量
1.环境变量操作
| 命令 | 功能 | 格式 |
|---|---|---|
| printenv | 查看环境变量 | printenv |
| setenv | 新建/修改变量 | setenv 变量名 值 |
| saveenv | 保存变量到flash | saveenv |
2.内存操作(了解)
md[b,w,l] 地址 [数量]:查看内存nm[b,w,l] 地址:修改指定地址内存mw[b,w,l] 地址 值 [计数]:填充一段内存cp[b,w,l] 源 目标 计数:内存数据拷贝
3.网络命令
ping 目标IP:测试网络连通tftp 内存地址 文件名:tftp下载文件到内存nfs 内存地址 服务器路径:nfs下载文件到内存
完整网络启动环境变量配置示例
env default -a #恢复默认环境变量
saveenv
reset
setenv ipaddr 192.168.1.50 #开发板IP
setenv ethaddr 00:04:9f:04:d2:35 #MAC地址
setenv gatewayip 192.168.1.1 #网关
setenv netmask 255.255.255.0 #子网掩码
setenv serverip 192.168.1.100 #PC主机IP
#内核启动参数
setenv bootargs 'console=ttymxc0,115200 root=/dev/nfs nfsroot=192.168.1.100:/home/linux/nfs/rootfs,v3,proto=tcp rw ip=192.168.1.50:192.168.1.100:192.168.1.1:255.255.255.0::eth0:off'
#下载zImage、dtb并启动
setenv bootcmd 'tftp 80800000 zImage;tftp 83000000 imx6ull‑alientek‑emmc.dtb;bootz 80800000 ‑ 83000000'
saveenv
reset
三、U‑Boot编译
-
解压源码:
tar -zxvf uboot.tar.gz && cd uboot -
依赖安装(图形menuconfig):
sudo apt‑get install libncurses5‑dev
-
编译三步
#清理工程
make ARCH=arm CROSS_COMPILE=arm‑linux‑gnueabihf‑ distclean
#加载板子默认配置
make ARCH=arm CROSS_COMPILE=arm‑linux‑gnueabihf‑ mx6ull1_alientek_emmc_defconfig
#编译,‑j16多线程,V=0精简输出
make V=0 ARCH=arm CROSS_COMPILE=arm‑linux‑gnueabihf‑ ‑j16
参数说明
ARCH=arm:目标架构ARMCROSS_COMPILE:指定交叉编译器前缀V=0:精简编译输出;V=1输出完整编译命令,用于调试
- 编译输出产物:顶层目录
u‑boot.imx
四、烧录
Ubuntu下使用imxdownload工具烧写:
./imxdownload u‑boot.bin /dev/sdd
烧写至SD卡,开发板拨码SD卡启动,上电后配置uboot环境参数。
五. U-Boot 启动 3 大阶段
阶段 1:i.MX6ULL Boot ROM(芯片内部 ROM,不属于 U-Boot)
芯片出厂固化程序,上电最先运行,是启动 U-Boot 的前提 执行任务:
- 检测启动模式(SD/EMMC/NAND/QSPI),由拨码开关决定;SD/EMMC 未完全初始化,仅读取存储设备前端部分数据。
- 初始化基础时钟:
arm_pll 396M,system_PLL 528M。 - 读取启动设备中
uboot.imx头部信息。 - 将 uboot.imx 头部信息加载到片内 RAM(OCRAM,地址
0x00900000)。
uboot.imx 组成:
IVT + BootData + DCD + u-boot.bin
阶段 2:U-Boot 第一阶段(SPL,Secondary Program Loader)
运行位置:片内 RAM OCRAM 核心使命:初始化 DDR,加载完整 U-Boot 镜像 执行任务:
- 关闭看门狗,防止芯片自动复位。
- 配置 CPU 主频、系统时钟,i.MX6ULL 一般设 792MHz,初始化 PLL 锁相环。
- 初始化 IOMUXC 引脚复用,配置 DDR 引脚、启动设备引脚。
- 初始化 DDR 控制器 + DDR 校准(核心!无 DDR,U-Boot 和 Linux 都无法运行)
- 完整初始化 SD/EMMC/NAND/QSPI 控制器。
- 从 Flash 读取完整 U-Boot 镜像,加载到 DDR 地址
0x87800000。 - 跳转到 DDR 中运行完整 U-Boot,BootROM 工作结束。
u-boot.bin 加上 IVT、BootData、DCD 头部信息,打包生成 u-boot.imx。
阶段 3:U-Boot 第二阶段(U-Boot 主程序,可交互命令行)
✅ 运行位置:DDR 0x87800000,就是串口看到的 U-Boot 命令行 执行任务:
- 初始化 DDR
- 初始化时钟(CPU 主频、总线时钟)
- 初始化存储外设(SD/EMMC/NAND)
- 通过 TFTP/NFS 加载 Linux 内核 zImage、设备树 dtb 到内存
- 向 Linux 内核传递 bootargs 启动参数
- 调用 bootz,启动 Linux 内核
编译 U-Boot 后,工程顶层目录生成
u-boot.imx。
简述:
- BootROM(阶段 1):芯片固化代码,上电最先跑,根据拨码选择启动介质,把 uboot 头部加载到 OCRAM。
- SPL(U-Boot 阶段 1,OCRAM):初始化 DDR,把完整 uboot 拷贝到 DDR,跳转过去运行。
- U-Boot 主程序(阶段 2,DDR):命令交互,加载内核与设备树,传参,启动 Linux。
- uboot.imx = IVT+BootData+DCD + u-boot.bin,用 imxdownload 烧录到 SD 卡。
补充Linux查找命令
find ./ -name '文件名' #按文件名搜索
grep -Rin '内容' #按文件内容搜索