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所支持的鏡像類型