KURO-BOX/T4 の FIT (Flattened uImage Tree) に関するページです。

概略

下の起動画面を見ても分かるように、KUROBOX-T4 の U-Boot では、FIT (Flattened uImage Tree) と呼ばれる方式を採用している。FIT は、kernel や ramdisk などを一つのファイルにまとめて、取り扱えるようにしたものである。filesource_file_format.txt によれば、

Evolution of the 2.6 Linux kernel for embedded PowerPC systems introduced new
booting method which requires that hardware description is available to the
kernel in the form of Flattened Device Tree.

Booting with a Flattened Device Tree is much more flexible and is intended to
replace direct passing of 'struct bd_info' which was used to boot pre-FDT
kernels.

ってことなので、PowerPCシステムで kernel 2.6 で導入されたハードウェアの違いを kernel に取り込む FDT (Flattened Device Tree) という仕組みを ramdisk イメージなどと一緒に uImage に取り込んでしまう仕掛けが FIT のようである。

用語

  • FIT - Flattened uImage Tree
    FIT is formally a flattened device tree (in the libfdt meaning), which conforms to bindings defined in this document.
  • .its - image tree source
  • .itb - image tree blob
  • .tdb - device tree blob

The FDT blob is required to properly boot FDT based kernel, so the minimal configuration for 2.6 FDT kernel is (kernel, fdt) pair.

FIT 対応 uImage ファイルの作成

filehowto.txt によれば、FIT に対応した uImage ファイルを作成するには、U-Boot に付属する mkimage ツールと、バイナリ形式内蔵対応の dtc コマンドが必要である。

To summarize the prerequisites needed for new uImage creation:
- mkimage (FIT サポートが取り込まれたのが 2008年3月11日なので、U-Boot 1.3.3 以降)
- dtc (with support for binary includes)
- image source file (*.its)
- image data file(s)


Here's a graphical overview of the image creation and booting process:

image source file     mkimage + dtc		  transfer to target
	+	     ---------------> image file --------------------> bootm
image data files(s)

kernel イメージなどの取り出し

既に、DDD さんが FlashROM から カーネルや initrd の取り出しに成功している。 KURO-BOX/T4 (4) - D Blog

HDD boot ファイルからの取り出し

HDD に Debian をインストールすると、/boot パーティションに以下のファイルがコピーされる。

$ ls -al /boot
total 136634
drwxr-xr-x  3 root root      1024 Dec 29  2005 .
drwxr-xr-x 22 root root      4096 Dec 29  2005 ..
-rw-r--r--  1 root root 133986350 Dec 29  2005 KURO-NAS-hddrootfs
-rw-r--r--  1 root root   5111200 Jul 11 04:49 kuro_nas_t4.itb
drwx------  2 root root     12288 Dec 29  2005 lost+found
-rwxr-xr-x  1 root root    245868 Jul 11 04:49 u-boot-kuro-nas-t4.bin
lrwxrwxrwx  1 root root        15 Dec 29  2005 uImage.buffalo -> kuro_nas_t4.itb

このうち、kuro_nas_t4.itb がカーネルや Ramdisk イメージなどを含む image tree blob と呼ばれるバイナリファイルである。

起動時の画面表示から、itb ファイルに含まれるファイル群とオフセット、サイズを取り出すことにより、こちらでも、HDD の /boot パーティションにある kuro_nas_t4.itb ファイルからカーネルを取り出すことができた。

## Booting kernel from FIT Image at 00500000 ...
   Using 'conf@1' configuration
   Trying 'kernel@1' kernel subimage
     Description:  Linux kernel
     Type:         Kernel Image
     Compression:  gzip compressed
     Data Start:   0x005000e8
     Data Size:    1844364 Bytes =  1.8 MB
     Architecture: PowerPC
     OS:           Linux
     Load Address: 0x00000000
     Entry Point:  0x00000000
     Hash algo:    sha1
     Hash value:   845984557f1bab7570be096380a2cecbf3b09c25
   Verifying Hash Integrity ... sha1+ OK
## Loading init Ramdisk from FIT Image at 00500000 ...
   Using 'conf@1' configuration
   Trying 'ramdisk@1' ramdisk subimage
     Description:  initramfs
     Type:         RAMDisk Image
     Compression:  gzip compressed
     Data Start:   0x006c265c
     Data Size:    3261387 Bytes =  3.1 MB
     Architecture: PowerPC
     Hash algo:    sha1
     Hash value:   ad1da9a87f32964044244936156ea838dc9f9d5b
   Verifying Hash Integrity ... sha1+ OK
## Flattened Device Tree from FIT Image at 00500000
   Using 'conf@1' configuration
   Trying 'fdt@1' FDT blob subimage
     Description:  Flattened Device Tree blob
     Type:         Flat Device Tree
     Compression:  uncompressed
     Data Start:   0x009deb0c
     Data Size:    3836 Bytes =  3.7 kB
     Architecture: PowerPC
     Hash algo:    sha1
     Hash value:   fba7f0b57375e53d725366543ce4c3c6e134bd89
   Verifying Hash Integrity ... sha1+ OK
   Booting using the fdt blob at 0x9deb0c
   Uncompressing Kernel Image ... OK
   Loading Ramdisk to 07c0d000, end 07f293cb ... OK
   Loading Device Tree to 007fc000, end 007ffefb ... OK
  • vmlinux.gz
    FIT イメージファイル (uImage.buffalo - 実態は kuro_nas_t4.itb) が 0x00500000 にロードされ、gzip圧縮形式のカーネルイメージが 0x005000e8 から 1,844,364 byte の大きさなので、0xe8 = 232 より、以下のコマンドで vmlinux.gz が取り出せる。
    $ dd if=../kuro_nas_t4.itb of=vmlinux.gz bs=1 count=1844364 skip=232
    $ file vmlinux.gz
    vmlinux.gz: gzip compressed data, was "vmlinux.bin.30102", from Unix, last modified: Sat Jul 11 04:37:40 2009, max compression
  • initrd.img
    initramfs のイメージファイルが 0x6c265c からロードされるので、オフセットは 0x6c265c -0x500000 = 0x1C265C = 1844828、サイズが 3,261,387 byte なので、
    $ dd if=../kuro_nas_t4.itb of=initrd.img bs=1 count=3261387 skip=1844828
    $ file initrd.img
    initrd.img: gzip compressed data, from Unix, last modified: Sat Jul 11 04:42:43 2009, max compression
  • kuro_nas_t4.dtb
    同様に、Device Tree blob が 0x009deb0c から 3,836 byte の大きさなので、0x009deb0c - 0x00500000 = 0x004deb0c = 5,106,444 より、以下のコマンドで dtb ファイルが取り出せる。
    $ dd if=../kuro_nas_t4.itb of=kuro_nas_t4.dtb bs=1 count=3836 skip=5106444

Flash ROM からの取り出し

基本的には、DDD さん と同じ。

まずは、KURO-BOX/T4 で MTD パーティションからデータを取り出し、ファイルに保存し、何らかの方法で作業マシンに転送しておく。

# cat /proc/mtd
dev:    size   erasesize  name
mtd0: 00300000 00010000 "Linux(kernel + initrd + dtb)"
mtd1: 00060000 00010000 "U-Boot"
mtd2: 00010000 00010000 "U-Boot params"
mtd3: 00090000 00010000 "unused"

# cat /dev/mtd0 > mtd0.bin

次に、起動画面表示からファイルサイズとオフセットの取得。

## Booting kernel from FIT Image at ffc00000 ...
   Using 'conf@1' configuration
   Trying 'kernel@1' kernel subimage
     Description:  Linux kernel
     Type:         Kernel Image
     Compression:  gzip compressed
     Data Start:   0xffc000e8
     Data Size:    1479294 Bytes =  1.4 MB
     Architecture: PowerPC
     OS:           Linux
     Load Address: 0x00000000
     Entry Point:  0x00000000
     Hash algo:    sha1
     Hash value:   53dee4e6b6fb2bb2b16af3839010a0c1879f1aeb
   Verifying Hash Integrity ... sha1+ OK
## Loading init Ramdisk from FIT Image at ffc00000 ...
   Using 'conf@1' configuration
   Trying 'ramdisk@1' ramdisk subimage
     Description:  initramfs
     Type:         RAMDisk Image
     Compression:  gzip compressed
     Data Start:   0xffd69450
     Data Size:    1659293 Bytes =  1.6 MB
     Architecture: PowerPC
     Hash algo:    sha1
     Hash value:   ca49bd2d2ea2850565cbb3b2a90a1b4f40454049
   Verifying Hash Integrity ... sha1+ OK
## Flattened Device Tree from FIT Image at ffc00000
   Using 'conf@1' configuration
   Trying 'fdt@1' FDT blob subimage
     Description:  Flattened Device Tree blob
     Type:         Flat Device Tree
     Compression:  uncompressed
     Data Start:   0xffefe6d4
     Data Size:    3836 Bytes =  3.7 kB
     Architecture: PowerPC
     Hash algo:    sha1
     Hash value:   fba7f0b57375e53d725366543ce4c3c6e134bd89
   Verifying Hash Integrity ... sha1+ OK
   Booting using the fdt blob at 0xffefe6d4
   Uncompressing Kernel Image ... OK
   Loading Ramdisk to 07d94000, end 07f2919d ... OK
   Loading Device Tree to 007fc000, end 007ffefb ... OK
  • vmlinux.gz
    FIT イメージが 0xffc00000 にロードされ、gzip圧縮形式のカーネルイメージが 0xffc000e8 から 1,479,294 byte の大きさなので、0xe8 = 232 より、以下のコマンドで vmlinux.gz が取り出せる。
    $ dd if=../mtd0.bin of=vmlinux.gz count=1479294 bs=1 skip=232
    $ file vmlinux.gz
    vmlinux.gz: gzip compressed data, was "vmlinux.bin.16999", from Unix, last modified: Sat Jul 11 04:21:02 2009, max compression
  • initrd.img
    0xffd69450 からメモリにロードされるので、オフセットは 0xffd69450 - 0xffc00000 = 0x169450 = 1479760、サイズは 1659293 byte なので、
    $ dd if=../mtd0.bin of=initrd.img bs=1 count=1659293 skip=1479760
    $ file initrd.img
    initrd.img: gzip compressed data, from Unix, last modified: Sat Jul 11 04:42:02 2009, max compression
  • kuro_nas_t4.dtb
    同様に、Device Tree blob が 0xffefe6d4 から 3,836 byte の大きさなので、0xffefe6d4 - ffc00000 = 0x2FE6D4 = 3,139,284 より、以下のコマンドで dtb ファイルが取り出せる。
    $ dd if=../kuro_nas_t4.itb of=kuro_nas_t4.dtb count=3836 bs=1 skip=3139284
    詳しくは、u-boot のソースコードの doc/uImage.FIT 以下にあるファイルを参考のこと。

filehowto.txt
filesource_file_format.txt
filekernel_fdt.its.txt

DTB (Device Tree Blob) から DTS (Device Tree Source) ファイルの復元

上記の kuro_nas_t4.tdb ファイルから kuro_nas_t4.dts ファイルを復元してみる。

$ dtc -I dtb -O dts -o kuro_nas_t4.dts kuro_nas_t4.dtb
 			timebase-frequency = <0x1f04000>;

0x1f04000 = 32522240 となっており、これがシステムクロックが狂う原因と思われる。

また、KURO-BOX/T4 から取り出した .dtb ファイルのサイズは 3,836 byte、.dts から作成した .dtb ファイルは 2,812 byte だった。ちょうど1,024 byte 大きくなっているので、dtc コマンドで .dtb ファイルを作成する際に、-S か -p オプションで 1024 が指定されていたものと類推される。

FIT 対応 mkimage のインストール

前述のように、FIT に対応しているのは U-Boot 1.3.3 以降なので、Lenny などで apt-get でインストールされる mkimage は FIT に対応していない。

mkimage のみビルドする

mkimage はソースコードの tools ディレクトリにあるので、toolsだけ作成することもできる。しかし、README にあるように、make の前にダミーでもよいので特定のボード用に config しなければいけない。

$ cd workdir
$ wget ftp://ftp.denx.de/pub/u-boot/u-boot-2009.08.tar.bz2
$ tar jxvf u-boot-2009.08.tar.bz2
$ cd u-boot-2009.08
$ make linkstation_HGLAN_config
$ make tools
$ sudo cp tools/mkimage /usr/local/bin/

上の例では、LinkStation HGLAN 用にコンフィグしているが、クロスコンパイル用の環境変数を設定していないので、command not found がたくさん出るが、mkimage はちゃんとビルドされる。

KURO-BOX/T4 用 U-Boot も作成する

ついでなので、KURO-BOX/T4 用の U-Boot も作成できるようにKURO-BOX/T4 用の U-Boot 2009.06 を元に 2009.08 版へのパッチを作成した。

U-Bootのサイトからソースコードをダウンロードして、先ほど作成したパッチを当てる。ここで、クロスコンパイラは /usr/cross/freescale-4.3/bin にインストールした Sourcery を使用している。

$ cd workdir
$ wget ftp://ftp.denx.de/pub/u-boot/u-boot-2009.08.tar.bz2
$ tar jxvf u-boot-2009.08.tar.bz2
$ cd u-boot-2009.08
$ patch -p 1 < ../u-boot-2009.08.diff
$ export PATH=/usr/cross/freescale-4.3/bin:$PATH
$ make CROSS_COMPILE=powerpc-linux-gnu- kuro_nas_t4_config
$ make CROSS_COMPILE=powerpc-linux-gnu-
$ sudo cp tools/mkimage /usr/local/bin/

u-boot.bin ができるのが、動作確認していないので、利用される方はあくまでも自己責任でお願いします。

FIT 対応 uImage の作成

FIT 対応 uImage の作成 ページへ。

参考


添付ファイル: filekuro_nas_t4.dts.txt 1160件 [詳細] fileu-boot-2009.08.diff.txt 869件 [詳細] filekernel_fdt.its.txt 969件 [詳細] filesource_file_format.txt 4244件 [詳細] filehowto.txt 2712件 [詳細]

トップ   差分 バックアップ リロード   一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2009-09-29 (火) 03:26:13 (3931d)