使用U-Boot的mkimage制作FIT鏡像或給鏡像加協議頭


1.環境信息:

  Version Info:U-Boot 2016.092.0+g199df35 (Nov 20 2016 - 12:55:17 +0800)

  ARCH:arm

  CPU:Freescale LS1020 Serial

  Cross Compiler: arm-linux-gnueabihf-

2.制作鏡像: 

FIT鏡像制作示例,FIT是內核、設備樹、文件系統合並成一個文件的一種鏡像,並且一個FIT鏡像里邊可能包含了很多個內核、設備樹、文件系統等;

<1>准備文件:

    a.可執行程序:mkimage;

        該文件在U-Boot編譯完成后,源碼目錄下/tools/有編譯好的二進制程序;

    b.分開的鏡像文件:zImage、rootfs.gz、dev-tree.dtb;

        zImage由內核源碼編譯后在arch/arm/boot/zImage目錄下;

        rootfs.gz由busybox編譯后,添加相關文件、目錄后制作而成,參見 “busybox根文件系統制作”;

        dev-tree.dtb是設備樹編譯好后的二進制文件,在linux源碼目錄執行make dtbs可生成,也可用linux源碼目錄的/scripts/dtc/dtc工具編譯;

    c.描述合並后鏡像信息的文件:image_info.its;

        *.its文件需要用戶自己編寫,編寫時可以參考U-Boot源碼目錄下的./doc/uImage.FIT/kernel.its文件編寫;

<2>生成FIT鏡像

  命令:./mkimage -f image_info.its fit.img

  其中:-f 表明要依據its文件內描述的文件制作FIT鏡像;image_info.its文件是針對當前單板構建的鏡像信息描述文件;fit.img是最后生成的FIT鏡像文件名,文件名和拓展名自定義(file命令可以看到不管文件拓展名是啥,文件本質是:data)

  注:執行該條命令時,需要把its文件內描述的鏡像文件放在指定的路徑下,mkimage工具會依據its文件內描述自動加載文件,生成的fit.img文件也可以依據需求指定文件的路徑,最好是絕對路徑。

<3>給單個鏡像文件加協議頭

<3.1>內核鏡像加協議頭:

  命令:./mkimage -A arm -O linux -T kernel -C none -a 0x21000000 -e 0x21000040 -n "ARM32 Linux Kernel" -d zImage uImage

  執行結果示例

[root@bogon mk_images]# ./mkimage -A arm -O linux -T kernel -C none -a 0x21000000 -e 0x21000040 -n "ARM32 Linux Kernel" -d zImage uImage
Image Name:   ARM32 Linux Kernel
Created:      Tue May 21 14:22:06 2019
Image Type:   ARM Linux Kernel Image (uncompressed)
Data Size:    9134592 Bytes = 8920.50 KiB = 8.71 MiB
Load Address: 21000000
Entry Point:  21000040
#注:0x21000000是uImage的開始地址,0x21000040是跳過開頭的64bytes后zImage的地址。

<3.2>文件系統鏡像加協議頭:

  命令:./mkimage -A arm -O linux -T ramdisk -C gzip -n "ARM32 Linux Kernel" -d ramdisk.gz rootfs

  執行結果示例

[root@bogon mk_images]# ./mkimage -A arm -O linux -T ramdisk -C gzip -n "ARM32 Linux Rootfs" -d ramdisk.gz rootfs
Image Name:   ARM32 Linux Kernel
Created:      Tue May 21 14:30:27 2019
Image Type:   ARM32 Linux Rootfs
(gzip compressed) Data Size: 4718592 Bytes = 4608.00 KiB = 4.50 MiB Load Address: 00000000 Entry Point: 00000000

<3.3>設備樹鏡像加協議頭:

  命令:暫未測試

 

<3.4>合並鏡像文件

  將三個加頭后鏡像文件合並到一個文件中:參見第二步合並鏡像,其他方式暫未測試 

 注:U-Boot所支持的鏡像類型:即-T后跟的參數類型  

[root@bogon mk_images]# ./mkimage -T list
Invalid image type, supported are:
        Unknown image type  Unknown image type
        aisimage         Davinci AIS image
        atmelimage       ATMEL ROM-Boot Image
        filesystem       Filesystem Image
        firmware         Firmware
        firmware_ivt     Firmware with HABv4 IVT
        flat_dt          Flat Device Tree
        fpga             FPGA Image
        gpimage          TI Keystone SPL Image
        imximage         Freescale i.MX Boot Image
        invalid          Invalid Image
        kernel           Kernel Image
        kernel_noload    Kernel Image (no loading done)
        kwbimage         Kirkwood Boot Image
        lpc32xximage     LPC32XX Boot Image
        multi            Multi-File Image
        mxsimage         Freescale MXS Boot Image
        omapimage        TI OMAP SPL With GP CH
        pblimage         Freescale PBL Boot Image
        pmmc             TI Power Management Micro-Controller Firmware
        ramdisk          RAMDisk Image
        rkimage          Rockchip Boot Image
        rksd             Rockchip SD Boot Image
        rkspi            Rockchip SPI Boot Image
        script           Script
        socfpgaimage     Altera SOCFPGA preloader
        standalone       Standalone Program
        tee              Trusted Execution Environment Image
        ublimage         Davinci UBL image
        vybridimage      Vybrid Boot Image
        x86_setup        x86 setup.bin
        zynqimage        Xilinx Zynq Boot Image
        zynqmpimage      Xilinx ZynqMP Boot Image

 

3.U-Boot識別和引導FIT鏡像

<1>將鏡像下載到目標單板

  一般采用tftp網絡下載鏡像文件到目標單板,

  命令:tftp 0x41000000 fit.img

  其中:0x41000000 是加載的位置,可以是內存也可以是Nor Flash的地址;

            (注:Nor Flash可能需要sf(SPI Flash SubSystem)或者其他命令實現,具體依據U-Boot功能)

  :fit.img文件應位於和目標板連在同一網絡的服務器上,且服務器上有tftp服務,fit.img位於tftp服務的目錄下。

            (注:CentOS的tftp服務目錄不能更改,可能是因為xinet服務沒有安裝,安裝后重啟PC即可,重啟服務沒有用)

<2>U-Boot查看下載到單板的FIT鏡像

  命令:iminfo 0x41000000

  其中:0x41000000 是下載的FIT鏡像地址

<3>U-Boot從FIT鏡像啟動

  命令:bootm 0x41000000

  其中:0x41000000 是下載的FIT鏡像地址

4.mkimage的詳細解析

制作鏡像的命令幫助信息:  

[root@localhost u-boot]# ./tools/mkimage
使用示例:
  獲取已制作好的鏡像的信息
  .
/tools/mkimage -l fit.img  
  
  制作FIT(Flattened device tree)鏡像
  ./tools/mkimage -f image_info.its fit.img
  
  為單一鏡像加鏡像協議頭
.
/tools/mkimage [-x] -A 處理器架構 -O 操作系統類型 -T 鏡像類型 -C 壓縮類型 -a 鏡像地址 -e 內核鏡像地址 -n 鏡像名稱 -d data_file[:data_file...] image
  mkimage工具的各參數含義
  -A ==> set architecture to 'arch'   //設置處理器架構
  -O ==> set operating system to 'os'   //設置操作系統類型
  -T ==> set image type to 'type'   //設置鏡像類型
  -C ==> set compression type 'comp'   //設置壓縮類型
  -a ==> set load address to 'addr' (hex) //設置鏡像的地址(該鏡像表示加已64byte文件頭的鏡像地址,該文件頭屬於U-Boot識別內核用)
  -e ==> set entry point to 'ep' (hex) //設置內核鏡像的地址,用於讀取真正內核的鏡像
  -n ==> set image name to 'name' //設置鏡像的名稱
  -d ==> use image data from 'datafile' //設置鏡像為數據文件   -x ==> set XIP (execute in place)     //設置是否在Flash內執行代碼,當鏡像存儲在Nor Flash中時,可以在Nor中開辟空間運行程序。
  將文件系統大包到FIT鏡像中:
.
/tools/mkimage [-D dtc_options] [-f fit-image.its|-f auto|-F] [-b <dtb> [-b <dtb>]] [-i <ramdisk.cpio.gz>] fit.img
<dtb> file is used with -f auto, it may occur multiple times.   -D => set all options for device tree compiler //設置編譯設備樹的命令字   -f => input filename for FIT source      //制作FIT鏡像所需要的格式信息,一般是*.its文件,或者后面跟auto自動生成   -i => input filename for ramdisk file      //文件系統鏡像,用於制作FIT鏡像大包
  
-l ==> list image header information //打印已制作好的鏡像信息
Signing / verified boot not supported (CONFIG_FIT_SIGNATURE undefined) //當前boot不支持動態簽名認證(校驗)<需要定義宏CONFIG_FIT_SIGNATURE>
  -V ==> print version information and exit //打印當前制作鏡像的軟件工具版本
Use '-T list' to see a list of available image types //運行mkimage時加參數'-T list'顯示當前mkimage所支持的鏡像類型

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM