help命令或者?

**bootz命令

bootz 的内部工作流程大致分为以下几个阶段:

1. 内核映像格式检查

U-Boot 会检查指定地址处是否为一个有效的 zImage。zImage 具有特殊的头部结构(通常包含自解压代码),其前 40 字节中有一个魔数(例如 0x016f2818)用于标识 ARM Linux 内核。若格式错误,命令会报错退出。

2. 处理 initrd(可选)

如果提供了 initrd 地址和大小,U-Boot 会将 initrd 的信息记录到内存中的启动参数区域(或通过设备树传递给内核)。内核启动后会挂载 initrd 作为初始根文件系统。

3. 处理设备树(FDT)

U-Boot 会对提供的 DTB 进行必要的处理:

  • 如果 DTB 地址不在内存中(例如是 flash 地址),可能需要先复制到 RAM。
  • 修正 DTB:U-Boot 会将内存节点(/memory)、启动参数(chosen/bootargs)等信息写入 DTB。这依赖于 U-Boot 的配置(CONFIG_OF_LIBFDT)。
  • 验证 DTB 格式(魔数、版本等)。

如果未指定 FDT 地址,U-Boot 会依次查找:

  • 环境变量 fdtaddr
  • 环境变量 fdtcontroladdr(如果存在) 如果都找不到,则不会传递设备树,内核将回退到使用 ATAGS 启动(老式方式)。

4. 准备启动参数

U-Boot 会根据内核启动约定,将必要的信息传递给内核。在 ARM 体系结构中,启动时寄存器状态约定为:

  • r0 = 0
  • r1 = 机器类型编号(如果使用 ATAGS,不使用设备树时有效)
  • r2 = ATAGS 或 DTB 的物理地址

当使用设备树时,U-Boot 会将设备树地址放入 r2,并将 r1 通常设置为 0(表示使用设备树)。具体的寄存器使用可参考 Linux 内核文档(Documentation/arm/Booting)。

5 .跳转到内核

U-Boot 找到 zImage 的入口点(通常就是加载地址),清理缓存并执行跳转指令,将控制权交给内核的自解压代码。后续由 zImage 完成自解压和最终内核的引导。