完整流程解析
第一步:设置启动命令(bootcmd)
bash
setenv bootcmd 'tftp 80800000 zImage;tftp 83000000 imx6ull-alientek-emmc.dtb;bootz 80800000 - 83000000
命令拆解
这个命令做了三件事:
| 步骤 | 命令 | 作用 | 目标地址 |
|---|---|---|---|
| 1 | tftp 80800000 zImage |
从 TFTP 服务器下载内核镜像 | 内存 0x80800000 |
| 2 | tftp 83000000 imx6ull-alientek-emmc.dtb |
从 TFTP 服务器下载设备树 | 内存 0x83000000 |
| 3 | bootz 80800000 - 83000000 |
启动内核 | 使用上面的地址 |
存储位置
bash
saveenv # 保存到 MMC(eMMC/SD卡)的 U-Boot 环境变量分区
以后每次开机,U-Boot 会自动执行 bootcmd 里的命令,不需要每次都手动输入。
第二步:设置启动参数(bootargs)
bash
setenv bootargs 'console=ttymxc0,115200 rw nfsroot=192.168.1.66:/home/zzk/linux/nfs/rootfs ip=192.168.1.50:192.168.1.66:192.168.1.1:255.255.255.0::eth0:off
| 参数 | 值 | 含义 |
|---|---|---|
| console | ttymxc0,115200 | 串口控制台,波特率 115200 |
| rw | - | 根文件系统读写挂载 |
| nfsroot | 192.168.1.66:/home/zzk/linux/nfs/rootfs | NFS 服务器路径 |
| ip | 192.168.1.50:192.168.1.66:192.168.1.1:255.255.255.0::eth0:off | 网络配置 |
IP 配置详解
bash
开发板IP : 服务器IP : 网关 : 子网掩码 : 主机名 : 网卡 : DHCP关闭
192.168.1.50 : 192.168.1.66 : 192.168.1.1 : 255.255.255.0 : (空) : eth0 : off
存储位置
bash
saveenv # 同样保存到 MMC
内核启动时会读取这些参数,根据参数配置网络和挂载根文件系统。
完整的启动流程(从上电到 Linux)
bash
┌─────────────────────────────────────────────────────────────────────┐
│ 1. 开发板上电
│ ↓
│ 2. 执行固化在芯片内的 BootROM
│ ↓
│ 3. BootROM 加载 MMC 中的 U-Boot
│ ↓
│ 4. U-Boot 启动,读取环境变量
│ ↓
│ 5. 执行 bootcmd(刚刚设置的命令)
│ ├─── tftp 80800000 zImage ← 从电脑下载内核
│ ├─── tftp 83000000 imx6ull-alientek-emmc.dtb ← 下载设备树
│ └─── bootz 80800000 - 83000000 ← 启动内核
│ ↓
│ 6. Linux 内核开始启动
│ ↓
│ 7. 内核读取 bootargs(启动参数)
│ ↓
│ 8. 根据 bootargs 配置网络:
│ - 开发板 IP: 192.168.1.50
│ - 网关: 192.168.1.1
│ - 子网掩码: 255.255.255.0
│ ↓
│ 9. 通过 NFS 连接服务器 192.168.1.66
│ ↓
│ 10. 挂载服务器目录: /home/zzk/linux/nfs/rootfs
│ 作为根文件系统 "/"
│ ↓
│ 11. 执行 /sbin/init
│ ↓
│ 12. 🎉 进入 Linux 系统!
└─────────────────────────────────────────────────────────────────────┘
bash
┌─────────────────────────────────────────────────────────────────┐
│ 你的电脑 (192.168.1.66)
│ ┌──────────────────────────────────────────────────────────┐
│ │ TFTP 服务器 (tftpd-hpa)
│ │ ├── /tftpboot/zImage ← 内核文件
│ │ └── /tftpboot/imx6ull-alientek-emmc.dtb ← 设备树
│ │
│ │ NFS 服务器 (nfs-kernel-server)
│ │ └── /home/zzk/linux/nfs/rootfs ← 完整的根文件系统
│ │ ├── /bin, /sbin, /etc, /lib...
│ │ ├── /dev, /proc, /sys...
│ │ └── 所有系统文件和程序
│ └──────────────────────────────────────────────────────────┘
└──────────────────────────┬──────────────────────────────────────┘
│
│ 以太网 (交换机/直连)
│
┌──────────────────────────┴──────────────────────────────────────┐
│ 开发板 (192.168.1.50)
│ ┌──────────────────────────────────────────────────────────┐
│ │ U-Boot (在内存中运行)
│ │ ├── 执行 bootcmd
│ │ ├── TFTP 下载内核 → 0x80800000
│ │ └── TFTP 下载设备树 → 0x83000000
│ │
│ │ Linux 内核 (在 0x80800000 运行)
│ │ ├── 解析 bootargs
│ │ ├── 配置 IP: 192.168.1.50
│ │ ├── NFS 挂载根文件系统
│ │ └── 启动完成!
│ └──────────────────────────────────────────────────────────┘
└─────────────────────────────────────────────────────────────────┘
bash
DDR3 内存 (IMX6ULL 512MB DDR)
起始地址: 0x80000000
结束地址: 0x9FFFFFFF
┌─────────────────────────────────────────────────────────────┐
│ 0x80000000 ┌─────────────────────────────────────────┐
│ │ U-Boot 自身占用 (前 8MB)
│ 0x80800000 ├─────────────────────────────────────────┤
│ │ zImage (内核镜像) ← TFTP 下载到这里
│ │ 大小约 5-10MB
│ ├─────────────────────────────────────────┤
│ │ 空闲区域
│ 0x83000000 ├─────────────────────────────────────────┤
│ │ imx6ull-alientek-emmc.dtb (设备树)
│ │ 大小约 50-100KB
│ ├─────────────────────────────────────────┤
│ │ 空闲区域 (用于内核运行)
│ │
│ 0x9FFFFFFF └─────────────────────────────────────────┘
└─────────────────────────────────────────────────────────────┘
与本地启动的对比
| 项目 | 当前配置(NFS 网络启动) | 本地启动(生产环境) |
|---|---|---|
| 内核 | TFTP 下载(电脑端) | eMMC/SD 卡读取 |
| 设备树 | TFTP 下载(电脑端) | eMMC/SD 卡读取 |
| 根文件系统 | NFS 挂载(电脑端) | eMMC/SD 卡读取 |
| 网络依赖 | ✅ 必须 | ❌ 不需要 |
| 修改代码 | 直接改电脑文件,重启生效 | 需要重新烧录 |
| 开发效率 | ⭐⭐⭐⭐⭐ 极高 | ⭐⭐ 较低 |
| 适用场景 | 开发调试 | 产品量产 |
要成功启动,还需要配置电脑端
电脑端必须运行的服务:
c
# 1. TFTP 服务(提供内核和设备树)
sudo systemctl start tftpd-hpa
# 2. NFS 服务(提供根文件系统)
sudo systemctl start nfs-kernel-server
# 3. 文件必须存在
ls /tftpboot/zImage
ls /tftpboot/imx6ull-alientek-emmc.dtb
ls /home/zzk/linux/nfs/rootfs/bin # rootfs 必须完整
网络连接:
bash 开发板 (192.168.1.50) ←→ 电脑 (192.168.1.66)
- 网线连接
- 都在同一网段
- 能互相 ping 通
bash
# U-Boot 启动介质设置详解
## 一、核心答案
U-Boot 中**没有单独一个命令**专门设置启动介质,而是通过 **`bootcmd` 环境变量**来决定从哪里启动。
```bash
# 查看当前启动命令
printenv bootcmd
# 不同启动介质的 bootcmd 示例
# 从网络启动(TFTP)
setenv bootcmd 'tftp 80800000 zImage; tftp 83000000 dtb; bootz 80800000 - 83000000'
# 从 eMMC/SD 卡启动
setenv bootcmd 'mmc dev 1; fatload mmc 1:1 80800000 zImage; fatload mmc 1:1 83000000 dtb; bootz 80800000 - 83000000'
# 从 NAND Flash 启动
setenv bootcmd 'nand read 80800000 200000 500000; nand read 83000000 700000 100000; bootz 80800000 - 83000000'