0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

深入解析U-Boot image.c:RK平台镜像处理核心逻辑

jf_44130326 来源:Linux1024 作者:Linux1024 2026-02-24 16:46 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

瑞芯微(RK)平台的嵌入式开发中,U-Boot作为核心的启动加载程序,负责完成镜像解析、校验、加载等关键流程。而image.c正是U-Boot中处理镜像(uImage)的核心文件,尤其针对RK平台的SD/NAND/SPI等启动方式做了专属适配。本文将拆解image.c的核心逻辑,梳理RK平台镜像处理的关键流程,帮助开发者理解和调试启动相关问题。

一、文件定位与核心作用

image.c是U-Boot中镜像管理的核心模块,主要负责:

•定义uImage镜像的属性枚举(架构、系统、类型、压缩方式);

•实现镜像头部/数据的CRC校验,确保镜像完整性;

•解析多组件镜像(Multi-File)的子镜像地址和大小;

•适配不同平台的镜像加载逻辑(如RK平台的专属镜像类型);

•格式化输出镜像信息(名称、大小、加载地址等)。

对于RK平台而言,该文件专门定义了rkimage/rksd/rkspi/rknand等专属镜像类型,适配RK芯片的SD卡、SPI Flash、NAND Flash等启动介质。

二、核心模块拆解

1.镜像属性枚举:定义RK平台专属类型

文件中通过4个核心枚举表定义了镜像的关键属性,其中镜像类型表(uimage_type)是RK平台适配的核心:

staticconsttable_entry_tuimage_type[] = { // ... 其他类型省略  {IH_TYPE_RKIMAGE,  "rkimage",  "Rockchip Boot Image"},  {IH_TYPE_RKSD,   "rksd",   "Rockchip SD Boot Image"},  {IH_TYPE_RKSPI,   "rkspi",   "Rockchip SPI Boot Image"},  {IH_TYPE_RKNAND,  "rknand",  "Rockchip NAND Boot Image"}, // ...};

•rkimage:RK通用启动镜像;

•rksd:RK SD卡启动镜像;

•rkspi:RK SPI Flash启动镜像;

•rknand:RK NAND Flash启动镜像。

这些类型对应RK芯片(如RK3568/RK3399/RK1808)的不同启动方式,U-Boot会根据镜像类型选择对应的加载逻辑。

2.镜像完整性校验:CRC校验双关卡

RK平台启动时,为避免镜像损坏导致启动失败,image.c实现了头部CRC数据CRC两层校验:

(1)头部CRC校验(image_check_hcrc)

校验镜像头部(image_header_t)的完整性,核心逻辑是清空头部CRC字段后重新计算CRC32,与原始值对比:

intimage_check_hcrc(constimage_header_t*hdr){  ulong hcrc;  ulong len =image_get_header_size(); image_header_theader; // 拷贝头部并清空CRC字段 memmove(&header, (char*)hdr,image_get_header_size()); image_set_hcrc(&header,0); // 重新计算CRC并对比  hcrc =crc32(0, (unsignedchar*)&header, len); return(hcrc ==image_get_hcrc(hdr));}

(2)数据CRC校验(image_check_dcrc)

校验镜像数据段的完整性,支持大镜像分块校验(避免看门狗超时):

intimage_check_dcrc(constimage_header_t *hdr){ ulongdata = image_get_data(hdr); ulonglen = image_get_data_size(hdr); ulongdcrc = crc32_wd(0, (unsignedchar*)data, len, CHUNKSZ_CRC32); return(dcrc == image_get_dcrc(hdr));}

3.多组件镜像处理:适配RK多段镜像加载

RK平台部分场景会使用“多组件镜像(Multi-File)”(如内核+Ramdisk+设备树),image.c通过以下函数解析子镜像:

•image_multi_count:统计多组件镜像的子镜像数量;

•image_multi_getimg:根据索引获取子镜像的加载地址和大小。

核心逻辑示例:

voidimage_multi_getimg(constimage_header_t *hdr,ulongidx,ulong*data,ulong*len){ ulongcount = image_multi_count(hdr);// 获取子镜像总数  uint32_t *size = (uint32_t *)image_get_data(hdr);// 子镜像大小表地址 ulongimg_data = image_get_data(hdr) + (count +1) *sizeof(uint32_t);// 子镜像数据起始地址 // ... 计算指定索引子镜像的偏移和地址}

4. RK平台专属适配点

(1)看门狗适配(memmove_wd)

RK平台普遍开启硬件看门狗,image.c在拷贝镜像数据时,会分块喂狗避免复位:

voidmemmove_wd(void*to,void*from, size_t len,ulongchunksz){#ifdefined(CONFIG_HW_WATCHDOG) || defined(CONFIG_WATCHDOG) while(len >0) {    size_t tail = (len > chunksz) ? chunksz : len;    WATCHDOG_RESET();// 喂狗    memmove(to,from, tail);    len -= tail;  }#else  memmove(to,from, len);#endif}

(2)地址配置适配

RK平台的镜像加载地址、内存范围通过以下函数适配:

•env_get_bootm_low:获取镜像加载的最低地址(默认SDRAM基地址);

•env_get_bootm_size:获取可用内存大小;

•load_addr:全局加载地址(可通过环境变量loadaddr修改)。

三、RK平台镜像处理完整流程

流程图(Mermaid语法)

wKgZO2mdZjqAP8hZAAHI3fqZJgM474.png

流程详解

1.镜像头部读取:从指定地址(如SD卡0x40000地址)读取image_header_t结构体,包含镜像魔数、CRC、加载地址、类型等信息;

2.魔数校验:验证镜像是否为合法的uImage(RK镜像需符合uImage格式);

3.头部CRC校验:确保镜像头部未被篡改,头部损坏会直接终止启动;

4.RK镜像类型判断:识别是SD/SPI/NAND类型的RK镜像,匹配对应加载逻辑;

5.数据CRC校验:校验镜像数据段完整性,避免因镜像损坏导致内核启动异常;

6.多组件解析(可选):若为Multi类型镜像,解析内核、Ramdisk、设备树等子镜像的地址和大小;

7.镜像拷贝:分块拷贝镜像数据到指定加载地址,拷贝过程中喂看门狗(RK平台看门狗超时默认复位);

8.入口点跳转:跳转到镜像的入口地址(如内核入口),完成启动流程。

四、调试与实战要点

1.镜像信息打印:通过image_print_contents函数可输出镜像详细信息(名称、类型、加载地址等),RK平台调试时可开启该功能定位问题;

2.Ramdisk校验:image_get_ramdisk函数专门校验RK平台Linux启动的Ramdisk镜像,需确保Ramdisk的架构、类型与内核匹配;

3.环境变量适配:RK平台可通过bootm_low/bootm_size/loadaddr等环境变量调整镜像加载的内存范围,适配不同硬件配置;

4.CRC校验关闭:调试阶段可临时关闭数据CRC校验(注释image_check_dcrc调用),快速验证镜像是否可启动(正式版本必须开启)。

五、总结

image.c作为U-Boot镜像处理的核心文件,为RK平台提供了专属的镜像类型定义、完整性校验、加载适配等能力。理解其核心逻辑和处理流程,能帮助开发者快速定位RK平台启动过程中的镜像损坏、加载地址错误、看门狗超时等问题。在实际开发中,可结合流程图和调试要点,高效排查镜像相关的启动故障,保障RK平台产品的稳定性。

若需修改RK平台镜像类型或校验逻辑,建议优先修改uimage_type枚举表和image_check_dcrc/memmove_wd等核心函数,同时注意适配看门狗和内存地址配置,避免引入新的启动问题。

审核编辑 黄宇

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • u-boot
    +关注

    关注

    0

    文章

    135

    浏览量

    39920
  • 瑞芯微
    +关注

    关注

    27

    文章

    841

    浏览量

    54647
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    更新 U-boot 时出现的问题求解

    我在尝试更新 U-boot 时遇到问题。最初我无法启动 Fedora,但后来我读到了这并尝试更新 U-boot。但是,当我按照官方文档我卡在迷你机屏幕上,什么也做不了。我担心董事会来了 DOA......
    发表于 04-01 07:20

    更新固件后 U-boot 不运行怎么解决?

    我刷新了从这里下载的新fw_payload固件(u-boot 和 opensbi):用于 TF 卡兼容性的新 u-boot 二进制文件 -.现在它启动到 OpenSBI,但无法达到 U-boot。我
    发表于 03-25 08:17

    玩转U-Boot bdinfo:嵌入式bsp开发者的定制、扩展与裁剪实战指南

    作为嵌入式开发者,U-Boot 是我们调试、适配板卡的核心工具,而 bdinfo 命令更是板级信息调试的“利器”——它能直观打印内存布局、Flash 信息、网络配置、时钟频率等核心参数。但原厂
    的头像 发表于 02-24 15:26 834次阅读
    玩转<b class='flag-5'>U-Boot</b> bdinfo:嵌入式bsp开发者的定制、扩展与裁剪实战指南

    深入解析RK3588 U-Boot板级文件:evb_rk3588.c核心逻辑拆解

    在嵌入式开发领域,瑞芯微RK3588凭借超强的算力、丰富的接口和广泛的场景适配性,成为高端边缘计算、消费电子项目的热门选择。而U-Boot作为嵌入式系统的“第一道门”,负责硬件初始化、引导内核启动,其板级适配代码直接决定了芯片硬件能力的落地。
    的头像 发表于 02-24 15:24 954次阅读
    <b class='flag-5'>深入</b><b class='flag-5'>解析</b><b class='flag-5'>RK</b>3588 <b class='flag-5'>U-Boot</b>板级文件:evb_<b class='flag-5'>rk3588.c</b><b class='flag-5'>核心</b><b class='flag-5'>逻辑</b>拆解

    U-Boot SPL核心文件spl.c深度解析:从启动流程到调试优化

    解析 U-Boot 中 spl.c 文件的功能与作用,探讨其在系统调试和优化中的价值,并通过流程图和脑图帮助开发者快速掌握核心要点。
    的头像 发表于 02-05 14:08 415次阅读
    <b class='flag-5'>U-Boot</b> SPL<b class='flag-5'>核心</b>文件spl.<b class='flag-5'>c</b>深度<b class='flag-5'>解析</b>:从启动流程到调试优化

    深入解析U-Boot TPL代码:嵌入式启动的“第一棒”背后的秘密

    在嵌入式系统启动过程中,从按下电源键到操作系统开始运行,中间藏着一系列精密的初始化步骤。今天我们就来拆解 Rockchip 平台 U-Boot 中的 TPL(Tiny Program Loader)阶段核心代码tpl.
    的头像 发表于 02-05 14:07 1281次阅读
    <b class='flag-5'>深入</b><b class='flag-5'>解析</b><b class='flag-5'>U-Boot</b> TPL代码:嵌入式启动的“第一棒”背后的秘密

    深入解析U-Boot命令处理核心文件:功能、调试与开发价值

    在嵌入式系统开发中,U-Boot 作为主流的引导加载程序,其命令处理、交互逻辑和自动启动流程是核心功能模块。本文将围绕command.c、c
    的头像 发表于 02-03 15:44 979次阅读
    <b class='flag-5'>深入</b><b class='flag-5'>解析</b><b class='flag-5'>U-Boot</b>命令<b class='flag-5'>处理</b><b class='flag-5'>核心</b>文件:功能、调试与开发价值

    深入解析U-Boot核心文件board_f.c:知识点、调试要点与开发价值

    在嵌入式系统开发中,U-Boot 作为应用最广泛的引导程序,其底层初始化逻辑直接决定了硬件启动的稳定性与可靠性。
    的头像 发表于 02-03 15:38 852次阅读
    <b class='flag-5'>深入</b><b class='flag-5'>解析</b><b class='flag-5'>U-Boot</b><b class='flag-5'>核心</b>文件board_f.<b class='flag-5'>c</b>:知识点、调试要点与开发价值

    解析Rockchip平台U-Boot核心文件:boot_rkimg.c到底做了什么?

    在嵌入式开发中,U-Boot 作为引导程序的 “中流砥柱”,负责初始化硬件、加载内核并启动系统。对于 Rockchip 平台的设备(如常见的开发板、智能终端),boot_rkimg.cU
    的头像 发表于 02-03 15:29 929次阅读
    <b class='flag-5'>解析</b>Rockchip<b class='flag-5'>平台</b><b class='flag-5'>U-Boot</b><b class='flag-5'>核心</b>文件:<b class='flag-5'>boot_rkimg.c</b>到底做了什么?

    深入解析rk平台Android Bootloader核心代码:从启动流程到AVB验证

    作为Android设备启动的第一道“闸门”,Bootloader(以U-Boot为主)承担着初始化硬件、加载内核、验证镜像完整性的核心职责。今天我们拆解Rockchip平台
    的头像 发表于 01-22 07:06 465次阅读
    <b class='flag-5'>深入</b><b class='flag-5'>解析</b><b class='flag-5'>rk</b><b class='flag-5'>平台</b>Android Bootloader<b class='flag-5'>核心</b>代码:从启动流程到AVB验证

    深入解析RK平台Android/Linux Bootloader核心文件:android_bootloader.c

    Bootloader是Android设备启动的第一道“关卡”,负责初始化硬件、加载系统镜像并完成内核启动的前置准备。在基于U-Boot的Android设备中,android_bootloader.c
    的头像 发表于 01-09 10:58 1396次阅读
    <b class='flag-5'>深入</b><b class='flag-5'>解析</b><b class='flag-5'>RK</b><b class='flag-5'>平台</b>Android/Linux Bootloader<b class='flag-5'>核心</b>文件:android_bootloader.<b class='flag-5'>c</b>

    深入解析 RK 平台显示驱动:格式支持、处理流程与实现原理

    、驱动处理流程、核心实现原理三个维度,带您深入了解  RK  平台显示驱动的工作机制。 一、 RK
    的头像 发表于 12-02 07:10 499次阅读
    <b class='flag-5'>深入</b><b class='flag-5'>解析</b> <b class='flag-5'>RK</b> <b class='flag-5'>平台</b>显示驱动:格式支持、<b class='flag-5'>处理</b>流程与实现原理

    深入理解 RK3506 U-Boot 重定位:从代码到原理

    的启动代码,拆解 RK3506 平台 U-Boot 重定位的实现逻辑、关键步骤与底层原理。 路径:u-boot/arch/arm/cpu/a
    的头像 发表于 11-28 07:05 951次阅读
    <b class='flag-5'>深入</b>理解 <b class='flag-5'>RK</b>3506 <b class='flag-5'>U-Boot</b> 重定位:从代码到原理

    瑞芯微 RK3588 平台 Debian 系统开发案例与使用说明

    本文围绕创龙科技研发的瑞芯微 RK3588 平台评估板,详解 Debian 系统使用方法,涵盖 LinuxSDK 安装、系统镜像编译生成、根文件系统修改、系统文件替换、U-Boot
    的头像 发表于 11-05 14:28 841次阅读
    瑞芯微 <b class='flag-5'>RK</b>3588 <b class='flag-5'>平台</b> Debian 系统开发案例与使用说明

    U-Boot 无法识别 NAND怎么解决?

    U-Boot 无法识别 NAND
    发表于 09-03 06:37