[QEMU][Linux] boot Linux from U-boot on QEMU

U-boot on arm QEMU にて QEMU で U-boot を立ち上げて 外から tftp でメモリに転送しました。次にビルドした Linux kernel を転送して起動してみます。

Linux mainline の repository から clone してビルドします。

$ git clone git://git.kernel.org/pub/scm/linux/kernel/git/qemu.org/torvalds/linux.git
$ cd linux
$ make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- multi_v7_defconfig
$ make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- zImage dtbs

ビルドでできたイメージファイルを tftp サーバのディレクトリ (/tftpboot) にコピーします。

$ cp arch/arm/boot/zImage /tftpboot/
$ cp arch/arm/boot/vexpress-v2p-ca9.dtb /tftpboot/

root ファイルシステムを用意します。busybox で作るのが楽ですが、ここでは Linaro が提供している最小構成イメージを使うことにします。サイトから U-boot で読める形式のものをダウンロードします(時期によりファイル名が変更されるので先に web で確認してください)。

$ wget http://releases.linaro.org/openembedded/images/minimal-initramfs-armv7a/latest/linaro-image-minimal-initramfs-genericarmv7a-20170127-460.rootfs.cpio.gz.u-boot
$ cp linaro-image-minimal-initramfs-genericarmv7a-20170127-460.rootfs.cpio.gz.u-boot /tftpboot/rootfs.cpio.gz.u-boot

U-boot on arm QEMU  の手順で U-boot を起動します。起動したら、ネットワークの設定を行います。

=> setenv ipaddr 192.168.1.200     # target(QEMU) の IP アドレス
=> setenv serverip 192.168.1.1     # tftp サーバの IP アドレス
=> setenv netmask 255.255.255.0

bootargs に Linux の command line を設定します。

=> setenv bootargs root=/dev/ram0 rw console=ttyAMA0

tftp で先ほどサーバに置いたファイルの転送を行います。vexpress-a9 は 0x60000000 から SDRAM が実装されています。しかし先頭は kernel の実際の配置先に使用されるため、少し離して配置します。devicetree と rootfs も衝突しない場所に配置します。

=> tftp 0x62000000 zImage
=> tftp 0x63000000 vexpress-v2p-ca9.dtb
=> tftp 0x63008000 rootfs.cpio.gz.u-boot

転送した場所を指定して kernel を起動します。今回は圧縮イメージを使用しているので bootz を使用します。引数は「zImage の配置先」、「rootfs.cpio.gz.u-boot の配置先」、「vexpress-v2p-ca9.dtb の配置先」の順で指定します。

=> bootz 0x62000000 0x63008000 0x63000000
Kernel image @ 0x62000000 [ 0x000000 - 0x774fd8 ]
## Loading init Ramdisk from Legacy Image at 63008000 ...
Image Name:   linaro-image-minimal-initramfs-g
Image Type:   ARM Linux RAMDisk Image (gzip compressed)
Data Size:    8170953 Bytes = 7.8 MiB
Load Address: 00000000
Entry Point:  00000000
Verifying Checksum ... OK
## Flattened Device Tree blob at 63000000
Booting using the fdt blob at 0x63000000
Loading Ramdisk to 67710000, end 67edadc9 ... OK
Loading Device Tree to 67709000, end 6770f963 ... OK

Starting kernel ...

[    0.000000] Booting Linux on physical CPU 0x0
[    0.000000] Linux version 4.13.0-rc4 (kunih@ubuntu) (gcc version 6.3.1 20170404 (Linaro GCC 6.3-2017.05)) #1 SMP Fri Aug 11 10:47:38 JST 2017
[    0.000000] CPU: ARMv7 Processor [410fc090] revision 0 (ARMv7), cr=10c5387d
...
[    3.598945] Freeing unused kernel memory: 2048K
linaro-test [rc=0]#

無事 shell まで起動できました。


コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です