您的位置 首页 电源

具体介绍u-boot FIT image

详细介绍u-boot FIT image-Linux kernel在ARM架构中引入device tree(全称是flattened device tree,后续将会以FDT代称)的时候[1],其实怀揣了一个Unify Kernel的梦想—-同一个Image,可以支持多个不同的平台。

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?

后边有时间的话,能够追着这个疑问研讨研讨。

 

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/dianyuan/89716.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部