当前位置: 首页 > news >正文

[Linux外设驱动详解]U-Boot mkimage 工具分析

U-Boot mkimage 工具分析文档

1. 概述

本文档针对瑞芯微 RK3588 平台,深入分析 U-Boot 中mkimage工具的作用、原理和实现机制。通过源码分析,解答"为什么要使用 mkimage 工具生成 u-boot.bin 文件"这一问题。

硬件平台: 瑞芯微 RK3588
U-Boot 源码路径:./u-boot
分析日期: 2026-01-04


2. mkimage 工具简介

2.1 什么是 mkimage?

mkimage是 U-Boot 提供的一个镜像打包工具,用于在裸机二进制文件前添加特定格式的头部信息(header),使其能够被 Boot ROM 或 U-Boot 自身识别和加载。

源码位置:tools/mkimage.c

2.2 为什么需要 mkimage?

通过分析源码,我们可以总结出以下几个关键原因:

┌─────────────────────────────────────────────────────────────┐ │ mkimage 的核心作用 │ ├─────────────────────────────────────────────────────────────┤ │ 1. 添加标准化头部信息 - 描述镜像属性 │ │ 2. 完整性校验 - 通过 CRC/SHA 校验确保数据完整 │ │ 3. 多镜像支持 - 支持打包多个组件(内核/设备树/根文件系统) │ │ 4. 平台适配 - 为不同芯片平台添加特定的启动头 │ │ 5. 验证启动 - 支持签名和加密,确保镜像来源可信 │ └─────────────────────────────────────────────────────────────┘

3. mkimage 支持的镜像格式

3.1 两种主要格式

mkimage 支持两种镜像格式,定义在doc/mkimage.1中:

格式类型说明特点
Legacy 格式传统格式,64字节固定头部结构简单、向后兼容
FIT 格式Flattened Image Tree,新型格式灵活性强、支持多组件、支持签名验证

3.2 镜像类型定义

include/image.h中定义了所有支持的镜像类型:

/* 关键镜像类型枚举 */enum{IH_TYPE_INVALID=0,// 无效镜像IH_TYPE_STANDALONE,// 独立程序IH_TYPE_KERNEL,// OS 内核镜像IH_TYPE_RAMDISK,// RAMDisk 镜像IH_TYPE_MULTI,// 多文件镜像IH_TYPE_FIRMWARE,// 固件镜像IH_TYPE_SCRIPT,// 脚本文件IH_TYPE_FLATDT,// 扁平设备树 BlobIH_TYPE_RKIMAGE,// Rockchip Boot ImageIH_TYPE_RKSD,// Rockchip SD 卡镜像IH_TYPE_RKSPI,// Rockchip SPI 镜像IH_TYPE_RKNAND,// Rockchip NAND 镜像// ... 更多类型};

4. Legacy 格式详解

4.1 头部结构

Legacy 格式的头部结构定义在include/image.h:311-324

typedefstructimage_header{__be32 ih_magic;/* 镜像魔数: 0x27051956 */__be32 ih_hcrc;/* 头部 CRC 校验 */__be32 ih_time;/* 创建时间戳 */__be32 ih_size;/* 镜像数据大小 */__be32 ih_load;/* 数据加载地址 */__be32 ih_ep;/* 入口点地址 */__be32 ih_dcrc;/* 数据 CRC 校验 */uint8_tih_os;/* 操作系统类型 */uint8_tih_arch;/* CPU 架构 */uint8_tih_type;/* 镜像类型 */uint8_tih_comp;/* 压缩类型 */uint8_tih_name[IH_NMLEN];/* 镜像名称(32字节) */}image_header_t;

总大小: 64 字节

4.2 头部字段含义

字段大小说明
ih_magic4字节固定值0x27051956,用于识别镜像格式
ih_hcrc4字节头部自身的CRC32校验值
ih_time4字节镜像创建的时间戳
ih_size4字节镜像数据的大小(不含头部)
ih_load4字节镜像应加载到内存的地址
ih_ep4字节程序入口点地址
ih_dcrc4字节镜像数据的CRC32校验值
ih_os1字节操作系统类型(如Linux、VxWorks等)
ih_arch1字节CPU架构(如ARM、x86等)
ih_type1字节镜像类型(内核、固件等)
ih_comp1字节压缩类型(gzip、bzip2等)
ih_name32字节镜像名称字符串

4.3 Legacy 格式生成流程

源码实现在tools/default_image.c

// 设置头部信息的核心函数staticvoidimage_set_header(void*ptr,structstat*sbuf,intifd,structimage_tool_params*params){image_header_t*hdr=(image_header_t*)ptr;// 1. 计算数据的CRC校验值checksum=crc32(0,(constunsignedchar*)(ptr+sizeof(image_header_t)),sbuf->st_size-sizeof(image_header_t));// 2. 设置各项字段image_set_magic(hdr,IH_MAGIC);// 设置魔数image_set_time(hdr,time);// 设置时间戳image_set_size(hdr,imagesize);// 设置数据大小image_set_load(hdr,params->addr);// 设置加载地址image_set_ep
http://www.cnnetsun.cn/news/423414.html

相关文章:

  • pyinstaller打包后图标 不显示解决办法
  • 伪代码生成的终极指南:PseudoGen让代码理解变得如此简单
  • Downkyi哔哩下载神器:新手必备的8大实用技巧
  • ncmdump音乐解密工具:轻松解锁网易云音乐NCM加密文件
  • 5步解锁Dell G15散热性能:开源轻量替代方案深度评测
  • Unity游戏翻译终极指南:5分钟实现多语言无障碍畅玩
  • 震惊!DeepAgents开源框架让AI Agent自主规划任务,小白也能7天打造Claude Code级编程助手!
  • 【AI大模型开发实战】国土空间规划大模型从入门到精通!RAG技术+API调用,小白也能秒变大神
  • 硬核干货!医疗AI大模型开发实战:协和医院如何用大模型重构医教研管服?附UltraUnion超声诊断模型代码解析
  • LeagueAkari自动启动功能全面指南:从原理到实践
  • 英雄联盟个性化神器LeaguePrank:轻松打造你的专属客户端
  • Scarab模组管理器:空洞骑士玩家的终极管理指南
  • DownKyi:打造个人B站视频资源库的终极方案
  • Universal-x86-Tuning-Utility性能调优终极指南:快速上手释放硬件潜能
  • Windows右键菜单清理神器:ContextMenuManager让你的桌面操作效率翻倍
  • 深度重构技术文章创作Prompt
  • BetterJoy终极配置指南:快速实现Switch控制器PC端完美适配
  • 如何突破百度网盘限速:免费解析工具让下载速度飙升10倍
  • CefFlashBrowser终极指南:快速搭建专业Flash兼容环境的完整方案
  • Unity游戏自动翻译插件:5分钟实现多语言支持的终极指南
  • 终极PC游戏方案:BetterJoy让Switch控制器秒变专业电竞装备
  • 一月第一周周报(论文阅读)
  • 碧蓝航线Alas自动化工具:从手忙脚乱到优雅躺平
  • WeMod专业版特权解锁完全指南:轻松获取高级功能
  • Servlet 客户端 HTTP 请求
  • 流量分析_SnakeBackdoor-5
  • WorkshopDL完整使用指南:轻松获取Steam创意工坊模组
  • 从CAP定理看大数据图数据库的设计与选型
  • leetcode 848. Shifting Letters 字母移位-耗时100%
  • 基于Java的太阳光发电智慧管理系统的设计与实现全方位解析:附毕设论文+源代码