RK3568 Linux SDK编译后,那些烧录镜像(uboot.img/boot.img等)到底都是啥?一次讲清楚
2026/6/1 5:52:56 网站建设 项目流程

RK3568镜像文件全解析:从编译到烧录的深度指南

当你第一次完成RK3568 Linux SDK编译后,面对rockdev目录下那一堆.img文件,是否感到一头雾水?uboot.img和boot.img有什么区别?MiniLoaderAll.bin又是什么角色?这篇文章将带你深入理解每个镜像文件的结构、作用以及在启动流程中的位置,让你从"会编译"进阶到"懂原理"。

1. RK3568启动流程全景图

RK3568的启动过程是一个精心设计的链条,每个环节都有其特定的职责和镜像文件。典型的启动序列如下:

  1. 芯片ROM代码MiniLoaderAll.binuboot.imgboot.imgrootfs.img

这个链条中的每个箭头都代表一个关键的加载和跳转过程。让我们用一个简单的表格来对比这些关键镜像:

镜像文件存储位置主要功能对应源码目录
MiniLoaderAll.binSPI Flash/eMMC初始化DDR,加载U-Bootrkbin/
uboot.imguboot分区硬件初始化,加载内核u-boot/
boot.imgboot分区包含内核和设备树kernel/
rootfs.imgrootfs分区完整的Linux文件系统buildroot/

提示:在实际开发中,parameter.txt定义了这些分区在存储设备上的具体位置和大小,它是整个烧录过程的"地图"。

2. 深入关键镜像文件

2.1 MiniLoaderAll.bin:启动的第一道关卡

这个文件是RK3568平台上U-Boot运行前的小型加载程序,由两部分组成:

  • TPL (Tiny Program Loader)

    • 运行在芯片内部SRAM中
    • 主要职责是初始化DDR内存控制器
    • 通常只有几十KB大小
  • SPL (Secondary Program Loader)

    • 运行在已初始化的DDR内存中
    • 负责加载更大的uboot.img
    • 支持从多种存储设备(eMMC、SPI Flash、SD卡)读取数据

编译过程中,这两个组件会被合并成一个MiniLoaderAll.bin文件。你可以使用以下命令查看其组成:

rkbin/tools/rk_boot_tool -h MiniLoaderAll.bin

输出会显示TPL和SPL的详细信息,包括加载地址和入口点。

2.2 uboot.img:系统的引导管家

uboot.img是一个FIT(Flattened Image Tree)格式的镜像,它实际上是一个容器,包含了多个组件:

├── trust.img (ARM Trusted Firmware + OP-TEE OS) ├── u-boot.bin (主U-Boot二进制) └── u-boot.dtb (U-Boot设备树)

FIT格式的优势在于它可以包含多个镜像和它们的配置信息。你可以使用mkimage工具来解包uboot.img:

mkimage -l uboot.img

这个命令会显示镜像中包含的所有子镜像及其属性。在实际启动过程中,SPL会解析这个FIT镜像,并按顺序加载其中的组件。

2.3 boot.img:内核的载体

boot.img同样采用FIT格式,但它包含的是与Linux内核相关的内容:

├── kernel Image (压缩的Linux内核) ├── dtb (设备树二进制) └── resource.img (显示相关的资源文件)

资源文件(resource.img)通常包含以下内容:

  • 开机logo图片
  • 显示参数配置
  • 其他平台特定的二进制资源

解包boot.img的命令与uboot.img类似:

mkimage -l boot.img

2.4 parameter.txt:分区的蓝图

虽然parameter.txt本身不会被烧录到存储设备中,但它定义了整个存储设备的分区布局。一个典型的parameter.txt内容如下:

FIRMWARE_VER: 1.0 MACHINE_MODEL: RK3568 MACHINE_ID: 007 MANUFACTURER: RK3568 MAGIC: 0x5041524B ATAG: 0x00200800 MACHINE: 0xffffffff CHECK_MASK: 0x80 PWR_HLD: 0,0,A,0,1 TYPE: GPT CMDLINE: mtdparts=rk29xxnand:0x00002000@0x00004000(uboot),0x00002000@0x00006000(misc),0x00010000@0x00008000(boot),0x00010000@0x00018000(recovery),0x00010000@0x00028000(backup),0x00040000@0x00038000(rootfs),0x00008000@0x00078000(oem),-@0x00080000(userdata)

关键字段解析:

  • CMDLINE:定义了每个分区的名称、大小和偏移量
  • TYPE:分区表类型,通常是GPT或GPT+Legacy
  • MAGIC:魔数,用于验证文件有效性

3. 镜像定制实战技巧

3.1 替换开机logo

如果你想自定义开机logo,需要修改resource.img:

  1. 解包resource.img:

    tools/resource_tool --unpack ./resource.img ./resource
  2. 替换logo图片(通常为bmp格式):

    cp custom_logo.bmp resource/logo.bmp
  3. 重新打包:

    tools/resource_tool ./resource ./new_resource.img
  4. 更新boot.img:

    mkimage -f boot.its new_boot.img

3.2 调整分区大小

当rootfs空间不足时,可以修改parameter.txt中的分区定义:

  1. 找到rootfs分区定义:

    0x00040000@0x00038000(rootfs)

    这里0x00040000是分区大小(单位512字节扇区)

  2. 计算新大小(例如扩大到1GB):

    1GB = 1024*1024*1024 bytes = 2097152 sectors 十六进制表示为0x200000
  3. 更新为:

    0x00200000@0x00038000(rootfs)

注意:调整分区大小时要确保不会与其他分区重叠,并且要考虑存储设备的实际容量。

3.3 内核调试技巧

在开发过程中,你可能需要修改内核命令行参数。这可以通过修改boot.img的its文件实现:

  1. 解包boot.its:

    kernel/make_boot_img.sh --unpack
  2. 修改boot.its文件,在chosen节点添加或修改参数:

    chosen { bootargs = "console=ttyFIQ0 root=/dev/mmcblk0p6 rootwait earlyprintk"; };
  3. 重新打包:

    mkimage -f boot.its new_boot.img

4. 烧录与验证

4.1 烧录工具选择

RK3568支持多种烧录方式:

  • Windows平台

    • RKDevTool:图形化工具,支持分区烧录和完整镜像烧录
    • AndroidTool:类似RKDevTool,更适合Android系统
  • Linux平台

    • upgrade_tool:命令行工具,功能强大
    • rkflash.sh:SDK中提供的脚本工具

4.2 关键烧录命令示例

使用upgrade_tool进行烧录的基本流程:

sudo upgrade_tool ul MiniLoaderAll.bin sudo upgrade_tool di -p parameter.txt sudo upgrade_tool di -u uboot.img sudo upgrade_tool di -b boot.img sudo upgrade_tool di -r rootfs.img sudo upgrade_tool rd

4.3 烧录验证技巧

烧录完成后,可以通过以下方式验证:

  1. 检查分区表:

    cat /proc/mtd
  2. 验证内核版本:

    cat /proc/version
  3. 检查文件系统挂载:

    mount | grep mmcblk0
  4. 验证U-Boot环境变量:

    fw_printenv

5. 常见问题排查

5.1 启动卡在Loader阶段

可能原因及解决方案:

  1. MiniLoaderAll.bin版本不匹配

    • 确保使用与芯片型号完全匹配的Loader
    • 尝试使用SDK中提供的官方Loader
  2. DDR初始化失败

    • 检查开发板DDR类型与配置是否匹配
    • 在rkbin目录中查找适合你开发板的DDR初始化bin文件
  3. 存储设备识别问题

    • 确认eMMC/SPI Flash已正确焊接
    • 尝试降低Loader的运行频率

5.2 内核panic无法启动

常见排查步骤:

  1. 检查串口输出,确定panic的具体原因
  2. 验证设备树是否正确:
    fdtdump /boot/dtb.img | less
  3. 检查内核命令行参数:
    cat /proc/cmdline
  4. 尝试使用已知正常的boot.img进行对比测试

5.3 文件系统挂载失败

解决方案:

  1. ���查parameter.txt中的rootfs分区定义
  2. 验证rootfs.img的文件系统类型:
    file rootfs.img
  3. 尝试手动挂载测试:
    mount -o loop rootfs.img /mnt
  4. 检查文件系统完整性:
    fsck.ext4 -f rootfs.img

在实际项目中,最常遇到的坑是文件系统大小与分区不匹配。一个实用的技巧是在编译rootfs时预留10%的额外空间:

make menuconfig # 在Buildroot配置中设置 -> Filesystem images -> exact size (设置为比分区小10%)

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询