2012年12月11日
LTSI3.4のカーネルをビルドしてKZM-A9-GTボードで動かしてみる
LTSIのカーネルにはKZM-A9-GTボード(kzm9g)のサポートがバックポートされています。LTSI3.4のリリース候補が出ました。このソースを取得してビルドして起動する手順を紹介します。このリリースではKZM-A9-GTボードでは従来の方法では起動できなくて、必ずデバイスツリーを使用する必要があります。
開発環境として、 Ubuntu 12.04 LTS (x86_64)を使用しています。
0.準備
0.1 パッチコマンドの準備
LTSIのリポジトリにはquiltコマンドで扱える形式のパッチが登録されています。このパッチの中にはファイル名の変更を含むものがあります。通常のpatchコマンドではファイルのrenameはまだサポートされていないので、最新版のパッチをソースアーカイブから持って来てビルド、インストールする必要があります。
$ mkdir work $ cd work $ wget http://ftp.gnu.org/gnu/patch/patch-2.7.tar.bz2 $ tar xvf patch-2.7.tar.bz2 $ mkdir obj $ cd obj $ ../patch-2.7/configure $ make $ sudo make install
patchコマンドのバージョンを確認します。
$ which patch /usr/local/bin/patch $ patch --version GNU patch 2.7 Copyright (C) 2003, 2009-2012 Free Software Foundation, Inc. Copyright (C) 1988 Larry Wall License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>. This is free software: you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law. Written by Larry Wall and Paul Eggert $
0.2 クロスコンパイラのインストール
今回はLinaroのサイトにあるLong Term Supportのコンパイラを使用しました。
$ wget https://launchpad.net/gcc-arm-embedded/4.6/4.6-2012-q2-update/+download/gcc-arm-none-eabi-4_6-2012q2-20120614.tar.bz2 $ sudo tar xvf gcc-arm-none-eabi-4_6-2012q2-20120614.tar.bz2 -C /usr/local
0.3 その他のツールのインストール
$ sudo apt-get git-core quilt u-boot-tools libncurses5-dev
libncurses5-devは make menuconfig を行うのに必要です。
1. LTSIパッチの取得
$ mkdir ltsi3421 $ git clone http://git.linuxfoundation.org/ltsi-kernel.git $ cd ltsi3421/ $ cd ltsi-kernel/ $ cat KERNEL_VERSION 3.4.21 $ cd ..
KERNEL_VERSIONのfileに、ベースにしているカーネルのバージョンが書かれています。このLTSIのパッチは3.4.21をベースにしてます。
2. 安定版カーネルのソースの取得とパッチの適用
安定版カーネルのv3.4.21のタグをチェックアウトします。
$ git clone http://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable.git $ cd linux-stable/ $ git checkout v3.4.21 -b ltsi3421
quiltコマンドでLTSI用のパッチを全て適用します。patchコマンドを更新しておかないとここでエラーが出ます。
$ export QUILT_PATCHES=../ltsi-kernel/ $ quilt push -a
3. ビルド
$ export ARCH=arm $ export CROSS_COMPILE=/usr/local/gcc-arm-none-eabi-4_6-2012q2/bin/arm-none-eabi- $ make kzm9g_defconfig $ make menuconfig
make menuconfig ではカーネルのブートパラメータを変更したり、使用するファイルシステムを追加したりします。
例えば以下を追加します。
CONFIG_BLK_DEV_INITRD=y CONFIG_CMDLINE_EXTEND=y CONFIG_DEVTMPFS=y CONFIG_DEVTMPFS_MOUNT=y CONFIG_EXT2_FS=y CONFIG_EXT3_FS=y CONFIG_EXT4_FS=y CONFIG_TMPFS_POSIX_ACL=y CONFIG_PRINTK_TIME=y CONFIG_DEBUG_KERNEL=y CONFIG_DEBUG_INFO=y
デバイスツリーの情報の渡しかたはいろいろありますが、ここではdtbファイルをzImageの後ろに連結して起動する方法を使用します。また、カーネルのブートパラメータはコンフィグファイルのデフォルト値を使用するように指定します。
CONFIG_ARM_APPENDED_DTB=y # CONFIG_ARM_ATAG_DTB_COMPAT is not set CONFIG_CMDLINE="console=tty0 console=ttySC4,115200 root=/dev/mmcblk0p2 rw ip=dhcp ignore_loglevel earlyprintk=sh-sci.4,115200" # CONFIG_CMDLINE_FROM_BOOTLOADER is not set # CONFIG_CMDLINE_EXTEND is not set CONFIG_CMDLINE_FORCE=y
$ make zImage dtbs
これで arch/arm/boot/zImage と arch/arm/boot/sh73a0-kzm9g.dtb ができあがります。
4. KZM-A9-GTボードで動かす
U-Bootからtftpでロードして動かしてみます。
catコマンドでzImageの後ろにdtbファイルを連結します。
$ cat out.kzm9g/arch/arm/boot/zImage out.kzm9g/arch/arm/boot/sh73a0-kzm9g.dtb > /tftpboot/zImage.kzm9g.ltsi3421
KZM-A9-GTボードのU-Bootのプロンプトで
KZM-A9-GT# set ipaddr 192.168.150.11 KZM-A9-GT# set serverip 192.168.150.1 KZM-A9-GT# tftp zImage.kzm9g.ltsi3421 smc911x: detected LAN9221 controller smc911x: phy initialized smc911x: MAC 00:01:9b:04:04:05 Using smc911x-0 device TFTP from server 192.168.150.1; our IP address is 192.168.150.11 Filename 'zImage.kzm9g.ltsi3421'. Load address: 0x43000000 Loading: ################################################################# ################################################################# ################################################################# ################################################################# ################################################################# ################################################################# ######################################## done Bytes transferred = 2200432 (219370 hex)
bootmの代わりにbootzと入力すれば起動できます。
KZM-A9-GT# bootz Starting kernel ... [ 0.000000] Booting Linux on physical CPU 0 [ 0.000000] Linux version 3.4.21-ltsi+ (koba@koba-linux2) (gcc version 4.6.2 20120613 (release) [ARM/embedded-4_6-branch revision 188521] (GNU Tools for ARM Embedded Processors) ) #4 SMP PREEMPT Tue Dec 11 11:22:34 JST 2012 [ 0.000000] CPU: ARMv7 Processor [412fc098] revision 8 (ARMv7), cr=10c5387d [ 0.000000] CPU: PIPT / VIPT nonaliasing data cache, VIPT aliasing instruction cache [ 0.000000] Machine: kzm9g, model: KZM-A9-GT [ 0.000000] debug: ignoring loglevel setting. [ 0.000000] Memory policy: ECC disabled, Data cache writealloc [ 0.000000] On node 0 totalpages: 124928 [ 0.000000] free_area_init_node: node 0, pgdat c0442080, node_mem_map c0471000 [ 0.000000] Normal zone: 1098 pages used for memmap [ 0.000000] Normal zone: 0 pages reserved [ 0.000000] Normal zone: 123830 pages, LIFO batch:31 [ 0.000000] bootconsole [early_ttySC4] enabled [ 0.000000] PERCPU: Embedded 7 pages/cpu @c08c0000 s6272 r8192 d14208 u32768 [ 0.000000] pcpu-alloc: s6272 r8192 d14208 u32768 alloc=8*4096 [ 0.000000] pcpu-alloc: [0] 0 [0] 1 [ 0.000000] Built 1 zonelists in Zone order, mobility grouping on. Total pages: 123830 [ 0.000000] Kernel command line: console=tty0 console=ttySC4,115200 root=/dev/mmcblk0p2 rw ip=dhcp ignore_loglevel earlyprintk=sh-sci.4,115200 [ 0.000000] PID hash table entries: 2048 (order: 1, 8192 bytes) [ 0.000000] Dentry cache hash table entries: 65536 (order: 6, 262144 bytes) [ 0.000000] Inode-cache hash table entries: 32768 (order: 5, 131072 bytes) [ 0.000000] Memory: 488MB = 488MB total ...