u-boot FIT image介绍

uboot验签kernel的实现 本文介绍uboot启动linux内核时,开启对kernel的签名认证功能,防止kernel和device tree被任意修改。fitimage本质上是dtb类型的结构,可用于打包不同的数据到一个文件中。这样做也是为了方便SecureBoot的实现,方便对kernel,system.dtb,rootfs进行RSA签名和认证。《u-boot FIT image介绍》提供了详细的结构解析,以及如何制作的命令。fitimage格式支持存储镜像的hash值,并且在加载镜像时会校验hash值。 阅读详情
1. 前言

Linux kernel在ARM架构中引入device tree(全称是flattened device tree,后续将会以FDT代称)的时候[1],其实怀揣了一个Unify Kernel的梦想----同一个Image,可以支持多个不同的平台。随着新的ARM64架构将FDT列为必选项,并将和体系结构有关的代码剥离之后,这个梦想已经接近实现:

在编译linux kernel的时候,不必特意的指定具体的架构和SOC,只需要告诉kernel本次编译需要支持哪些板级的platform即可,最终将会生成一个Kernel image,以及多个和具体的板子(哪个架构、哪个SOC、哪个版型)有关的FDT image(dtb文件)。

bootloader在启动的时候,根据硬件环境,加载不同的dtb文件,即可使linux kernel运行在不同的硬件平台上,从而达到unify kernel的目标。

本文将基于嵌入式产品中普遍使用的u-boot,以其新的uImage格式(FIT image,Flattened uImage Tree)为例,介绍达到此目标的步骤,以及背后的思考和意义。

2. Legacy uImage

从u-boot的角度看,它要boot一个二进制文件(例如kernel Image),需要了解该文件的一些信息,例如:

该文件的类型,如kernel image、dtb文件、ramdisk image等等?

该文件需要放在memory的哪个位置(加载地址)?

该文件需要从memory哪个位置开始执行(执行地址)?

该文件是否有压缩?

该文件是否有一些完整性校验的信息(如CRC)?

等等

结合“X-010-UBOOT-使用booti命令启动kernel(Bubblegum-96平台)”中有关booti的例子,上面信息被隐含在我们的命令行中了,例如:

通过DFU工具,将指定的image文件下载到指定的memory地址,间接的指定了二进制文件加载地址;

booti命令本身,说明加载的文件类型是ARM64平台的Image文件;

通过booti的参数,可以指定Kernel Image、ramdisk、DTB文件的执行位置;

等等。

不过,这种做法缺点很明显(总结来说,就是太啰嗦了):

需要往memory中搬不同的二进制文件(Kernel、DTB、ramdisk等);

boot指令(booti等)有比较复杂的参数;

无法灵活地处理二进制文件的校验、解压缩等操作;

等等。

为了解决上述缺点,u-boot自定义了一种Image格式----uImage。最初的时候,uImage的格式比较简单,就是为二进制文件加上一个header(具体可参考“include/image.h”中的定义),标示该文件的特性。然后在boot该类型的Image时,从header中读取所需的信息,按照指示,进行相应的动作即可。这种原始的Image格式,称作Legacy uImage,其特征可总结为:

1)使用mkimage工具(位于u-boot source code的tools/mkimage中)生成。

2)支持OS Kernel Images、RAMDisk Images等多种类型的Image。

3)支持gzip、bzip2等压缩算法。

4)支持CRC32 checksums。

5)等等。

最后,之所以称作Legacy,说明又有新花样了,这种旧的方式,我们就不再过多关注了,拥抱新事物去吧。

3. FIT uImage
3.1 简介

device tree在ARM架构中普及之后,u-boot也马上跟进、大力支持,毕竟,美好的Unify kernel的理想,需要bootloader的成全。为了支持基于device tree的unify kernel,u-boot需要一种新的Image格式,这种格式需要具备如下能力:

1)Image中需要包含多个dtb文件。

2)可以方便的选择使用哪个dtb文件boot kernel。

综合上面的需求,u-boot推出了全新的image格式----FIT uImage,其中FIT是flattened image tree的简称。是不是觉得FIT和FDT(flattened device tree)有点像?没错,它利用了Device Tree Source files(DTS)的语法,生成的image文件也和dtb文件类似(称作itb),下面我们会详细描述。

3.2 思路

为了简单,我们可以直接把FIT uImage类比为device tree的dtb文件,其生成和使用过程为[2]:

image source file        mkimage + dtc                           transfer to target 
           +                -----------------------------> image file -----------------------------------> bootm 
image data file(s)

其中image source file(.its)和device tree source file(.dts)类似,负责描述要生成的image file的信息(上面第2章描述的信息)。mkimage和dtc工具,可以将.its文件以及对应的image data file,打包成一个image file。我们将这个文件下载到么memory中,使用bootm命令就可以执行了。

3.3 image source file的语法

image source file的语法和device tree source file完全一样(可参考[3][4][5]中的例子),只不过自定义了一些特有的节点,包括images、configurations等。说明如下:

1)images节点

指定所要包含的二进制文件,可以指定多种类型的多个文件,例如multi.its[5]中的包含了3个kernel image、2个ramdisk image、2个fdt image。每个文件都是images下的一个子node,例如:

kernel@2 { 
    description = "2.6.23-denx"; 
    data = /incbin/("./2.6.23-denx.bin.gz"); 
    type = "kernel"; 
    arch = "ppc"; 
    os = "linux"; 
    compression = "gzip"; 
    load = <00000000>; 
    entry = <00000000>; 
    hash@1 { 
        algo = "sha1"; 
    }; 
};

可以包括如下的关键字:

description,描述,可以随便写;

data,二进制文件的路径,格式为----/incbin/("path/to/data/file.bin");

type,二进制文件的类型,"kernel", "ramdisk", "flat_dt"等,具体可参考中[6]的介绍;

arch,平台类型,“arm”, “i386”等,具体可参考中[6]的介绍;

os,操作系统类型,linux、vxworks等,具体可参考中[6]的介绍;

compression,二进制文件的压缩格式,u-boot会按照执行的格式解压;

load,二进制文件的加载位置,u-boot会把它copy对应的地址上;

entry,二进制文件入口地址,一般kernel Image需要提供,u-boot会跳转到该地址上执行;

hash,使用的数据校验算法。

2)configurations

可以将不同类型的二进制文件,根据不同的场景,组合起来,形成一个个的配置项,u-boot在boot的时候,以配置项为单位加载、执行,这样就可以根据不同的场景,方便的选择不同的配置,实现unify kernel目标。还以multi.its[5]为例,

configurations { 
    default = "config@1"; 

     config@1 { 
         description = "tqm5200 vanilla-2.6.23 configuration"; 
         kernel = "kernel@1"; 
         ramdisk = "ramdisk@1"; 
        fdt = "fdt@1"; 
     }; 

     config@2 { 
         description = "tqm5200s denx-2.6.23 configuration"; 
         kernel = "kernel@2"; 
         ramdisk = "ramdisk@1"; 
         fdt = "fdt@2"; 
    }; 

     config@3 { 
         description = "tqm5200s denx-2.4.25 configuration"; 
        kernel = "kernel@3"; 
         ramdisk = "ramdisk@2"; 
     }; 
};

它包含了3种配置,每种配置使用了不同的kernel、ramdisk和fdt,默认配置项由“default”指定,当然也可以在运行时指定。

3.4 Image的编译和使用

FIT uImage的编译过程很简单,根据实际情况,编写image source file之后(假设名称为kernel_fdt.its),在命令行使用mkimage工具编译即可:

$ mkimage -f kernel_fdt.its kernel_fdt.itb

其中-f指定需要编译的source文件,并在后面指定需要生成的image文件(一般以.itb为后缀,例如kernel_fdt.itb)。

Image文件生成后,也可以使用mkimage命令查看它的信息:

$ mkimage -l kernel.itb

最后,我们可以使用dfu工具将生成的.idb文件,下载的memory的某个地址(没有特殊要求,例如0x100000),然后使用bootm命令即可启动,步骤包括:

1)使用iminfo命令,查看memory中存在的images和configurations。

2)使用bootm命令,执行默认配置,或者指定配置。

使用默认配置启动的话,可以直接使用bootm:

bootm 0x100000

选择其它配置的话,可以指定配置名:

bootm 0x100000#config@2

以上可参考“doc/uImage.FIT/howto.txt[2]”,具体细节我们会在后续的文章中结合实例说明。

4. 总结

本文简单的介绍了u-boot为了实现Unify kernel所做的努力,但有一个问题,大家可以思考一下:bootloader的unify怎么保证呢?

SOC厂家提供(固化、提供二进制文件等)?

格式统一,UEFI?

后面有时间的话,可以追着这个疑问研究研究。

5. 参考文档

[1] Device Tree(一):背景介绍

[2] doc/uImage.FIT/howto.txt

[3] doc/uImage.FIT/kernel.its

[4] doc/uImage.FIT/kernel_fdt.its

[5] doc/uImage.FIT/multi.its

[6] doc/uImage.FIT/source_file_format.txt

 

原创文章,转发请注明出处。蜗窝科技,www.wowotech.net。


深入解析mkimage与dumpimage:从uImage到FIT image的嵌入式Linux内核打包与解析 本文深入解析了嵌入式Linux内核打包工具mkimage与dumpimage的核心功能与应用。详细阐述了如何使用mkimage将原始内核镜像转换为U-Boot可识别的uImage,并进一步打造包含内核、设备树、根文件系统的FIT image一体化启动包。同时介绍了dumpimage如何用于查看和提取FIT镜像中的组件,是嵌入式系统开发、定制启动流程和故障排查的必备技能。 阅读详情

相关推荐

rockchip 平台 linux FIT 打包格式介绍

rockchip 平台 linux FIT 打包格式介绍

一叶知秋的博客 2590

ARM uboot Legacy uImage 和 fit img (Flattened uImage Tree)原理介绍

目录 背景 一、先谈谈uboot 二、比较一下 Image 、zImage 、 Legacy uImage 和 FIT uImage 的区别 三、为什么会出现 Legacy uImage ,然后又出现 FIT uImage ? 四、Legacy uImage 是怎么把信息弄进镜像里的 五、fit img (Flattened uImage Tree) 的原理和生成 一、先谈谈uboot uboot 是嵌入式领域中用到的操作系统内核引导工具。 因为嵌入式发展相对pc 领域要慢一点。所以我一般会把

2032

基于MacOS本地部署OpenClaw+Ollama技术要点

本文基于MacOS系统下本地部署OpenClaw+Ollama的实操经验,梳理部署全流程中的核心技术要点、环境配置规范、故障排查方法及落地优化方案,聚焦“本地AI模型联动OpenClaw技能调度”的核心需求,为同类本地部署场景提供可复用的技术参考,规避常见部署风险,确保系统稳定运行。

在科技赋能新时代,共同探索基础理论和宇宙未知。 5163

U-Boot FIT Image

FIT 镜像一般都是把 data 嵌入到 FIT 结构内部,U-Boot 的 SPL 使用外部 data,也可以使用 data-offset 属性的存在性判断镜像类型。data-size 属性在两种情况下都会存在,但是 data-offset 和 data-position 属性只会存在一个。但是镜像数据也可以存储在 FIT 外部,通过 data-position 或者 data-offset 和 data-size 描述镜像信息,使得 FIT 结构变小。

wo___fu的博客 1647

树莓派入门教程 - 0 - 准备篇 - 0.0 SD卡制作树莓派系统镜像启动盘 开机

电脑需要提前安装的工具: sd卡格式化工具SDFormatter,官网下载链接:https://www.sdcard.org/downloads/formatter/ 镜像烧录工具Win32 Disk Imager,官网下载链接:https://win32diskimager.download/ 使用到的硬件: 一张容量大于等于16GB的TF卡 + 读卡器; 树莓派板卡。3B、3B+、4B等各型号均可,带有 HDMI接口即可。 HDMI接口的显示屏。 鼠标、键盘、电脑。 1....

Mark_md的博客 6972

Android音频学习(十四)——加载音频设备

loadHwModule 是 Android 音频系统的核心初始化函数,负责加载音频硬件抽象层(HAL)的模块实现。它建立 AudioPolicyService 与底层硬件的桥梁,将配置文件(audio_policy_config.xml)中的标签<module>定义转化为可操作的硬件对象,加载的是音频硬件模块(HAL实现),每个模块对应一种音频设备类型,以动态库的形式存在,负责与底层音频硬件交互。

miemie2014的博客 1731

u-boot FIT image介绍_转自“蜗窝科技”

转自:http://www.wowotech.net/u-boot/fit_image_overview.html 1. 前言 Linux kernel在ARM架构中引入设备树device tree(全称是flattened device tree,后续将会以FDT代称)的时候[1],其实怀揣了一个Unify Kernel的梦想----同一个Image,可以支持多个不同的平台。随着新的ARM64架...

weixin_33985507的博客 179

redhawk-sc使用简介

数据完整性对结果的准确性有很大影响,所以一定要保证数据完整性,Redhawk-sc在跑完后,Report里有Data Integrity界面,在这个界面会看到设计数据和库文件的数据完整性,在相应的报告中会有没有覆盖到的数据情况,要对每一项仔细检查,保证输入数据没有问题。文件一般加密,用户唯一需要选择的是文件的corner。其中,cell lef除了常规的standard cell,还有如DTCD,BTSV和clamp等cell的lef,不可缺失,否则data integrity将不是100%。

weixin_48518726的博客 3137

u-boot FIT image

u-boot FIT image介绍 作者:wowo 发布于:2016-9-2 21:49 分类:u-boot分析 1. 前言 Linux kernel在ARM架构中引入device tree(全称是flattened device tree,后续将会以FDT代称)的时候[1],其实怀揣了一个Unify Kernel的梦想----同一个Image,可以支持多个不同的平台。随着新的AR

luhao806的专栏 1235

ollama接入图像识别大模型

ollama接入图像识别大模型

qq_36437991的博客 2075

OpenHarmony WiFi子系统全解析:从架构到代码实现(大合集)

头文件路径[相对路径][相对路径][相对路径][相对路径]// 网络配置结构 (wifi_device_config.h)// SSID字符串// 预共享密钥// 安全类型// 网络ID// 优先级// 是否隐藏网络// 扫描信息结构 (wifi_scan_info.h)// SSID// BSSID (MAC地址)// 安全类型int rssi;// 信号强度// 频率// 信道宽度// 时间戳// 连接信息结构 (wifi_linked_info.h)

m0_67505153的博客 1059

FIT image介绍

作者:wowo 发布于:2016-9-2 21:49 分类:u-boot分析 1. 前言 Linux kernel在ARM架构中引入device tree(全称是flattened device tree,后续将会以FDT代称)的时候[1],其实怀揣了一个Unify Kernel的梦想----同一个Image,可以支持多个不同的平台。随着新的ARM64架构将FDT列为必选项,并将和体系结构

ee230的专栏 7435

第81篇:Vibe Coding时代:LangGraph + Eval评估体系实战,解决 Agent 优化全靠感觉的问题

本文介绍了一个为LangGraph Coding Agent设计的评估体系解决方案。文章首先指出了当前AI Coding Agent开发中的常见问题:优化过程缺乏客观评估标准,导致改进效果难以量化。随后提出了一个完整的评估框架,包括评估指标(任务成功率、质量指标、安全指标、成本指标和流程指标)、项目结构设计和评估案例集。 核心内容包括: 设计了JSON格式的评估案例集,覆盖正常任务、边界任务和高风险场景 实现了模拟Agent输出的演示代码 构建了多维度评分系统,包括关键词匹配、禁用词检测和成本评估 提供了评

sundong_81的博客 47
上一篇: Linux-4.4-x86_64 内核配置选项简介
下一篇: Linux内核驱动之GPIO子系统-GPIO的使用
wdsfup
博客等级 码龄20年 31粉丝 13原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值