Edit online

使用 FIT Image

28 May 2024
Read time: 2 minute(s)

ArtInChip 项目中,将 Kernel Image 改为使用 FIT Image 的原因:

  • 快速启动的需要

  • 减少分区的需要

  • 安全启动的需要

  • 支持 RISCV 的需要

快速启动

D21x 的快速启动,eMMC 的方案使用未压缩的 Image 速度最快,SPINOR/SPINAND 使用压缩的 zImage 比较合适。

同时 U-Boot 加载 Kernel 最好只读取 Kernel Image 实际大小的数据,避免过多读取无关数据, 才能节省启动时间。

U-Boot 加载 Kernel 时,无论 Image 还是 zImage,都没有头信息,因此即读取 Kernel Image 的大小需要根据实际编译生成的镜像大小进行修改。

如果采用 FIT Image 则可以避免上述问题。

生成的 FIT Image 有一个信息头,U-Boot 可以先读取信息头的数据,得到 Image 大小,然后按照实际大小读取 剩下的 Kernel Image 数据:

  1. 从存储介质读取的数据可以做到尽可能的少

  2. 开发者不需要手动修改读取的数据大小

当然是用了 FIT Image 之后,无论是使用压缩的 zImage/Image.gz 还是使用未压缩的 Image,对启动流程/启动命令 都没有影响,开发者仅需修改 ITS 文件配置即可。

减少分区

在使用 FIT Image 之前,Kernel 启动所需的 DTB 保存在一个独立的分区中。

DTB 使用一个独立的分区保存对于 SPINOR/SPINAND 的方案而言是一种比较浪费空间的方式。

对于 SPINOR 而言,一般存储空间都比较小,但是分区必须按照一个擦写单元进行,一般是 64KB, 而 DTB 绝大多数在 32KB 以内。

对于 SPINAND 而言,分区同样必须按照一个擦写块进行,一般是 128KB 或者 256KB, 同时要考虑坏块的情况,需要多分配几个块进行备份。

使用 FIT Image,Kernel 所使用的 DTB 与 Kernel 一起进行打包,存放到同一个分区, 有利于提高存储空间的利用效率,同时分区划分更简单。

安全启动

在安全启动方案中,安全信任链的校验过程如下:

BROM > SPL > U-Boot > Kernel > RootFS

按照上述顺序逐级进行安全校验。

在 SPL 校验 U-Boot 和 U-Boot 校验 Kernel 的阶段,如果使用 FIT Image,则已经有成熟的安全校验方案, 并且启动处理流程与非安全方案基本一致。不采用 FIT Image,则安全方案和非安全方案所采用的启动流程 差异性比较大,不利于方案的开发和维护。

支持 RISCV

RISCV 需要 OpenSBI 协助进行启动,OpenSBI 运行在 U-Boot 之前。

启动流程:BROM > SPL > OpenSBI > U-Boot > Kernel

RISCV 版本的 SPL 在加载运行 OpenSBI 和 U-Boot 时,仅支持使用 FIT Image, 即需要将下列几个数据打包为一个 ITB 文件(uboot.itb):

  • OpenSBI

  • U-Boot

  • DTB

SPL 加载 uboot.itb,读取 DTB 和 U-Boot 到对应的位置,然后运行 OpenSBI,通过 OpenSBI 跳转到 U-Boot。启动的 DTB 是 OpenSBI 和 U-Boot 共用。

Kernel 也使用 FIT Image,可以简化 Image 的种类。