U-Boot から Linux kernel を起動する際に、3つのイメージバイナリ (Linux kernel・devicetree・root filesystem)を読み込んでそれぞれの読み込んだメモリアドレスを指定して起動しますが、これを1つのイメージに統合した FIT image にすることで指定アドレスを1つにすることができます。
イメージ記述ファイル (*.its)
FIT image を作るための情報は devicetree 形式である its ファイルを使って記述します。典型的な its ファイルは以下のようになります (kernel.its)。
/dts-v1/; / { description = "fitImage for hoge"; #address-cells = <1>; images { kernel { description = "Linux kernel"; data = /incbin/("./Image.gz"); type = "kernel"; arch = "arm64"; os = "linux"; compression = "gzip"; load = <0x80080000>; entry = <0x80080000>; }; fdt { description = "Flattened devicetree blob"; data = /incbin/("./hoge.dtb"); type = "flat_dt"; arch = "arm64"; compression = "none"; }; ramdisk { description = "ramdisk"; data = /incbin/("./rootfs.cpio.gz"); type = "ramdisk"; arch = "arm64"; os = "linux"; compression = "gzip"; }; }; configurations { default = "config-1"; config-1 { description = "hoge configuration"; kernel = "kernel"; fdt = "fdt"; ramdisk = "ramdisk"; }; }; };
its ファイルは個々のイメージファイルの情報を記述する "images" ノードと、どのイメージファイルを使うかを記述する "configurations" ノードから成ります。"images" ノードは "kernel"、"fdt"、"ramdisk" の各サブノードを含みます。
"images" に含まれるそれぞれのサブノードは以下のようなプロパティを記述します。
kernel { description = "Linux kernel"; data = /incbin/("./Image.gz"); type = "kernel"; arch = "arm64"; os = "linux"; compression = "gzip"; load = <0x80080000>; entry = <0x80080000>; };
各プロパティは以下のような意味になります。
description | このイメージの説明を記述 |
data | イメージファイルを示すパスを記述 |
type | イメージの種別 "kernel", "fdt", "ramdisk" など |
arch | アーキテクチャ名 "arm64" など |
os | OS 名 "linux" など |
compression | 圧縮方式 "gzip" など |
load | ロードするアドレス (上位の #address-cells の word 数で示す) |
entry | 実行開始するアドレス (上位の #address-cells の word 数で示す) |
”configurations" ノードにはどのイメージを適用するかをまとめて記述するサブノードを置きます。"default" には無指定の場合にどのサブノードを適用するかを記述します。
config-1 { description = "hoge configuration"; kernel = "kernel"; fdt = "fdt"; ramdisk = "ramdisk"; };
なお、its ファイルの正式な仕様は U-Boot ソースの doc/uImage.FIT/source_file_format.txt に記載されています。
FIT image 生成
FIT image ファイルは以下を実行して生成します。its ファイルに記述した各イメージファイルがそのパス上になければなりません。
$ mkimage -f kernel.its fitimage.bin
正しく生成できているかは以下で確認します。
$ mkimage -l fitimage.bin
U-Boot での読込み
U-Boot ではメモリ上にイメージを読み込んだ後、bootm コマンドで kernel を boot することができます。また、イメージファイルが正しく読み込まれたかは iminfo コマンドで確認できます。
=> tftpboot $loadfile fitimage.bin => iminfo => bootm
コメント