尧图网站建设 尧图网络
  • 首页
  • 关于我们
  • 服务项目
  • 案例展示
  • 建站流程
  • 资讯中心
  • 联系我们
首页/资讯中心/详情

ARM64嵌入式Linux系统FIT uImage启动流程详解与实战

ARM64嵌入式Linux系统FIT uImage启动流程详解与实战
📅 发布时间:2026/7/15 4:22:10

1. FIT uImage基础概念与核心价值

在嵌入式Linux开发中,传统的内核启动方式需要分别加载内核镜像、设备树文件和根文件系统,这种分散式管理存在明显的局限性。FIT uImage(Flattened Image Tree)正是为解决这一问题而生的创新方案。它借鉴了设备树(FDT)的设计思想,通过单一镜像文件整合所有启动资源。

FIT的核心优势体现在三个方面:

  • 资源整合:将内核镜像(Image.gz)、设备树(.dtb)和根文件系统(ramdisk.gz)打包成单个.itb文件
  • 灵活配置:支持多套硬件配置方案,例如同一镜像可适配RK3399的不同开发板
  • 安全验证:内置CRC32/SHA1校验机制,确保镜像完整性

实际项目中,我曾遇到需要为同一款SoC适配多种外设配置的情况。传统方式需要维护多套镜像,而使用FIT后,只需在.its文件中定义不同配置组合,bootm时通过#conf-name指定即可,开发效率提升显著。

2. RK3399平台环境搭建

以OrangePi 4开发板(RK3399+4GB LPDDR4)为例,推荐使用Ubuntu 20.04作为开发环境。需要特别注意以下依赖项:

sudo apt-get install build-essential flex bison libssl-dev \ u-boot-tools device-tree-compiler lzop

关键工具版本要求:

  • mkimage:U-Boot 2021.04+
  • dtc:1.6.0+
  • aarch64-linux-gnu-gcc:9.3.0+

验证工具链是否就位:

mkimage -V # 应显示版本信息 dtc --version

常见问题排查:

  • 若出现mkimage: command not found,建议从U-Boot源码编译安装:
git clone https://github.com/u-boot/u-boot.git cd u-boot && make tools sudo cp tools/mkimage /usr/local/bin/

3. Linux内核配置与编译要点

针对FIT启动的特殊配置项:

make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- menuconfig

必须开启的选项:

Device Drivers → [*] Block devices → <*> RAM block device support (32768) Default RAM disk size General setup → [*] Initial RAM filesystem and RAM disk support

编译内核并生成关键文件:

make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- -j8 ls arch/arm64/boot/Image.gz # 压缩内核镜像 ls arch/arm64/boot/dts/rockchip/rk3399-orangepi-4.dtb # 设备树

踩坑记录:曾因未设置RAM disk大小导致启动时出现RAMDISK: incomplete write错误。解决方法是在内核配置中确保CONFIG_BLK_DEV_RAM_SIZE=32768。

4. 制作RAMDisk根文件系统

使用BusyBox构建最小根文件系统的完整流程:

# 1. 编译BusyBox make defconfig make menuconfig # 确保选中Static linking make install CROSS_COMPILE=aarch64-linux-gnu- # 2. 创建镜像文件 dd if=/dev/zero of=ramdisk bs=1M count=32 mkfs.ext2 -F ramdisk # 3. 填充文件系统 mkdir rootfs && sudo mount ramdisk rootfs sudo cp -r _install/* rootfs/ sudo umount rootfs # 4. 压缩镜像 gzip -9 ramdisk

优化技巧:使用genext2fs替代传统方法可节省时间:

genext2fs -b 32768 -d _install ramdisk gzip -9 ramdisk

5. ITS文件编写详解

典型RK3399的kernel.its文件结构解析:

/dts-v1/; / { description = "RK3399 Linux FIT Image"; #address-cells = <1>; images { kernel { description = "Linux 5.15 Kernel"; data = /incbin/("./Image.gz"); type = "kernel"; arch = "arm64"; os = "linux"; compression = "gzip"; load = <0x20000000>; // 必须与内核CONFIG_TEXT_OFFSET匹配 entry = <0x20000000>; hash-1 { algo = "sha256"; }; }; fdt { description = "RK3399 Device Tree"; data = /incbin/("./rk3399-orangepi-4.dtb"); type = "flat_dt"; arch = "arm64"; compression = "none"; hash-1 { algo = "sha256"; }; }; ramdisk { description = "Root Filesystem"; data = /incbin/("./ramdisk.gz"); type = "ramdisk"; arch = "arm64"; os = "linux"; compression = "gzip"; load = <0x40000000>; entry = <0x40000000>; hash-1 { algo = "sha256"; }; }; }; configurations { default = "standard"; standard { description = "Standard Boot Configuration"; kernel = "kernel"; fdt = "fdt"; ramdisk = "ramdisk"; }; recovery { description = "Recovery Mode"; kernel = "kernel"; fdt = "fdt"; // 无ramdisk,从网络加载 }; }; };

地址规划建议:

  • 内核加载地址:0x20000000(需确认具体平台MMU映射)
  • Ramdisk地址:0x40000000(避开内核区域)
  • DTB地址:建议放在内核之后,如0x2F00000

6. 生成FIT镜像实战

使用mkimage工具打包镜像:

mkimage -f kernel.its fit.itb

输出解析:

FIT description: RK3399 Linux FIT Image Created: Thu Jul 11 14:30:22 2024 Image 0 (kernel) Description: Linux 5.15 Kernel Type: Kernel Image Compression: gzip compressed Data Size: 11565898 Bytes = 11.03 MiB Architecture: AArch64 OS: Linux Load Address: 0x20000000 Entry Point: 0x20000000 Hash algo: sha256 Hash value: d2e47eff44fc1f69d2e559e0f54c5f4dc04db5d5 Image 1 (fdt) Description: RK3399 Device Tree Type: Flat Device Tree Data Size: 57862 Bytes = 56.51 KiB Architecture: AArch64 Hash algo: sha256 Hash value: 90c80a6779a00cdec1c5071d6f8dea3ed33867c4 Image 2 (ramdisk) Description: Root Filesystem Type: RAMDisk Image Compression: gzip compressed Data Size: 1177098 Bytes = 1.12 MiB Architecture: AArch64 OS: Linux Load Address: 0x40000000 Entry Point: 0x40000000 Hash algo: sha256 Hash value: 35b76a77 Default Configuration: 'standard' Configuration 0 (standard) Description: Standard Boot Configuration Kernel: kernel FDT: fdt Ramdisk: ramdisk Configuration 1 (recovery) Description: Recovery Mode Kernel: kernel FDT: fdt

高级技巧:添加签名支持(需配置U-Boot的CONFIG_FIT_SIGNATURE):

openssl genrsa -out key.pem 2048 mkimage -f kernel.its -k . -r fit-signed.itb

7. U-Boot引导与调试技巧

手动加载流程:

# 通过TFTP加载 tftp 0x10000000 fit.itb # 启动默认配置 bootm 0x10000000 # 或指定配置 bootm 0x10000000#recovery

自动化配置(写入eMMC):

# 擦除eMMC分区 mmc dev 0 mmc erase 0x8000 0x8000 # 写入镜像 mmc write 0x10000000 0x8000 0x8000 # 设置环境变量 setenv bootcmd 'mmc read 0x10000000 0x8000 0x8000; bootm 0x10000000' saveenv

典型问题排查:

  1. 内核加载地址冲突:

    ERROR: new format image overwritten - must RESET the board to recover

    解决方法:确保load地址(0x10000000)不与内核/ramdisk地址重叠

  2. 哈希校验失败:

    Bad Data Hash

    检查.its文件中指定的哈希算法与U-Boot支持的一致

  3. 设备树加载失败:

    FDT_ERR_BADMAGIC

    确认dtb文件是否正确打包,使用fdtdump验证

8. 启动日志深度解析

成功启动时的关键日志分析:

## Loading kernel from FIT Image at 10000000 ... Using 'standard' configuration Verifying Hash Integrity ... sha256+ OK ## Loading ramdisk from FIT Image at 10000000 ... Verifying Hash Integrity ... sha256+ OK ## Loading fdt from FIT Image at 10000000 ... Verifying Hash Integrity ... sha256+ OK Booting using the fdt blob at 0x10b07d60 Uncompressing Kernel Image ... OK Loading Ramdisk to f5e0e000, end f5f2d60a ... OK Loading Device Tree to 00000000f5dfc000, end 00000000f5e0d205 ... OK Starting kernel ... [ 0.000000] Booting Linux on physical CPU 0x0000000000 [0x410fd034]

关键时间节点优化:

  • 内核解压耗时:取决于压缩算法(gzip/lz4)
  • 设备树加载:确保地址对齐到8字节边界
  • Ramdisk加载:大容量文件系统建议使用ext4代替initrd

9. 高级应用场景

多DTB支持方案:

configurations { default = "khadas-edge"; khadas-edge { description = "Khadas Edge Board"; fdt = "fdt-edge"; ... }; orangepi-4 { description = "OrangePi 4 Board"; fdt = "fdt-orangepi"; ... }; }

安全启动实现:

  1. 生成密钥对:

    openssl genrsa -F4 -out fit.key 2048 openssl req -batch -new -x509 -key fit.key -out fit.crt
  2. 修改U-Boot环境:

    setenv bootargs "...#auth=yes" setenv bootcmd "ext4load mmc 0:1 0x10000000 fit.itb; bootm 0x10000000"

性能对比数据:

启动方式镜像大小加载时间内存占用
传统分离加载12.1MB1.2s分散
FIT uImage11.8MB0.9s集中
FIT+压缩8.4MB1.1s集中

在RK3399平台上实测显示,FIT方式可缩短约25%的启动时间,主要得益于减少了存储设备的寻址开销。

相关新闻

  • 【Multisim仿真实战】从零构建四路抢答器:核心电路模块深度解析与调试技巧
  • 沁恒 CH32V208(二): 深入解析存储映射、零等待机制与多外设时钟配置
  • DS90UB935-Q1图形发生器配置实战:从寄存器到1080p30彩条信号

最新新闻

  • LabVIEW图像模式匹配实战:从灰度到几何的工业缺陷检测
  • Python IndexError列表索引越界:原理、排查与防御性编程实战
  • ArcGIS Pro脚本工具(8)——国土报批TXT坐标文件批量转SHP实战
  • Claude Code 100个真实案例 - 用AI做批量文件格式转换器(图片/视频/文档)
  • 15个不容错过的开源低代码开发平台【2025精选】
  • 【智能体开发】《LangChain核心技术与LLM项目实践》_184.[第12章 项目实战] 意图推荐与联想输入:提升用户提问转化率

日新闻

  • 告别启动盘残留:用Diskpart彻底清除U盘EFI分区与恢复完整空间
  • 2026 年宜春诚信的塑料缠绕膜厂家哪个好,缠绕膜背后的秘密:你不知道的成本陷阱 - 领域鉴赏官
  • Arch ECS 入门指南:10分钟掌握C#高性能数据驱动架构

周新闻

  • IX9104 PCIe5.0 高速交换芯片@ACP#完整规格 + 应用场景总结
  • Unity游戏集成Coze智能体:实现NPC智能对话与知识库联动
  • SAP EPIC 建行回单查询:从标准类CL_EPIC_EXAMPLE_CN_CCB_GHTD到Z类的5处关键修改

月新闻

  • 2026年6月公司网站搭建最新热门渠道测评:四大低成本/零代码平台对比+避坑
  • 【Linux】Linux arm 编译QT程序,出现expected “}“报错
  • 【MATLAB例程】四基站二维AOA定位与距离辅助增强对比仿真。基于角度观测和测距修正的固定目标平面定位精度分析

关于尧图

  • 公司简介
  • 团队介绍
  • 企业文化
  • 荣誉资质

服务项目

  • 定制开发
  • 电商建站
  • UI 设计
  • 运维服务

快速链接

  • 案例展示
  • 建站流程
  • 常见问题
  • 资讯中心

联系方式

  • 📍北京市朝阳区互联网产业园 A 座 10 层
  • 📞400-888-8888
  • ✉️contact@rkmt.cn
  • 🕐周一至周日 9:00-21:00

© 2024 北京尧图网络科技有限公司 版权所有 | 京 ICP 备 XXXXXXXX 号