2012年09月24日
LTSI3.0のカーネルをビルドしてKZM-A9-GTボードで動かしてみる(更新)
LTSIのカーネルにはKZM-A9-GTボード(kzm9g)のサポートがバックポートされています。
LTSIのカーネルをソースを取得してビルドする手順を紹介します。
以前のページから更新しています。
- patchコマンドのversionが2.7になりました。
- LTSIのmasterが3.4に移行したので、3.0のブランチをチェックアウトするようにしました。
- LTSI3.0のベースのversionが3.0.43になりました。
開発環境として、 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 http://launchpad.net/gcc-arm-embedded/4.6/2011-q4-major/+download/arm-none-eabi-gcc-4_6-20111208.tar.bz2 $ sudo tar xvf arm-none-eabi-gcc-4_6-20111208.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 ltsi30 $ cd ltsi30 $ git clone http://git.linuxfoundation.org/ltsi-kernel.git $ cd ltsi-kernel/ $ git branch -a * master remotes/origin/3.0-ltsi remotes/origin/HEAD -> origin/master remotes/origin/master $ git checkout -b 3.0-ltsi remotes/origin/3.0-ltsi Branch 3.0-ltsi set up to track remote branch 3.0-ltsi from origin. Switched to a new branch '3.0-ltsi' $ cat KERNEL_VERSION 3.0.43 $ cd ..
LTSIのmasterは既に3.4に移行しているので、3.0-ltsiのブランチをチェックアウトします。
KERNEL_VERSIONのfileに、ベースにしているカーネルのバージョンが書かれています。このLTSIのパッチは3.0.43をベースにしてます。
2. 安定版カーネルのソースの取得とパッチの適用
安定版カーネルのv3.0.43のタグをチェックアウトします。
$ git clone http://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable.git $ cd linux-stable/ $ git checkout v3.0.43 -b ltsi3043
quiltコマンドでLTSI用のパッチを全て適用します。patchコマンドを更新しておかないとここでエラーが出ます。
$ export QUILT_PATCHES=../ltsi-kernel/ $ quilt push -a
3. ビルド
$ export ARCH=arm $ export CROSS_COMPILE=/usr/local/arm-none-eabi-gcc-4_6/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
$ make uImage
これで arch/arm/boot/uImage ができあがります。
4. KZM-A9-GTボードで動かす
U-BootからtftpでuImageをロードして動かしてみます。
$ cp arch/arm/boot/uImage /tftpboot/uImage.ltsi3043
KZM-A9-GTボードのU-Bootのプロンプトで
KZM-A9-GT# set ipaddr 192.168.1.162 KZM-A9-GT# set serverip 192.168.1.110 KZM-A9-GT# set bootargs root=/dev/mmcblk0p2 KZM-A9-GT# tftpboot uImage.ltsi3043 smc911x: detected LAN9221 controller smc911x: phy initialized smc911x: MAC 00:01:9b:04:04:12 Using smc911x-0 device TFTP from server 192.168.1.110; our IP address is 192.168.1.162 Filename 'uImage.ltsi3043'. Load address: 0x43000000 Loading: ################################################################# ################################################################# ################################################################# ################################################################# ################################################################# ################################################################# ############################################ done Bytes transferred = 2222036 (21e7d4 hex)
bootmと入力すれば起動できます。
KZM-A9-GT# bootm ## Booting kernel from Legacy Image at 43000000 ... Image Name: Linux-3.0.43-ltsi+ Image Type: ARM Linux Kernel Image (uncompressed) Data Size: 2221972 Bytes = 2.1 MiB Load Address: 41008000 Entry Point: 41008000 Verifying Checksum ... OK Loading Kernel Image ... OK OK Starting kernel ... [ 0.000000] Booting Linux on physical CPU 0 [ 0.000000] Linux version 3.0.43-ltsi+ (koba@koba-linux2) (gcc version 4.6.2 20110921 (release) [ARM/embedded-4_6-branch revision 182083] (GNU Tools for ARM Embedded Processors) ) #1 SMP PREEMPT Mon Sep 24 11:08:42 JST 2012 [ 0.000000] CPU: ARMv7 Processor [412fc098] revision 8 (ARMv7), cr=10c5387d [ 0.000000] CPU: VIPT nonaliasing data cache, VIPT aliasing instruction cache [ 0.000000] Machine: kzm9g [ 0.000000] debug: ignoring loglevel setting. [ 0.000000] Memory policy: ECC disabled, Data cache writealloc [ 0.000000] On node 0 totalpages: 126976 [ 0.000000] free_area_init_node: node 0, pgdat c044baa0, node_mem_map c047b000 [ 0.000000] Normal zone: 992 pages used for memmap [ 0.000000] Normal zone: 0 pages reserved [ 0.000000] Normal zone: 125984 pages, LIFO batch:31 [ 0.000000] bootconsole [early_ttySC4] enabled [ 0.000000] PERCPU: Embedded 7 pages/cpu @c0860000 s4672 r8192 d15808 u32768 [ 0.000000] pcpu-alloc: s4672 r8192 d15808 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: 125984 [ 0.000000] Kernel command line: console=tty0 console=ttySC4,115200 root=/dev/nfs ip=dhcp ignore_loglevel earlyprintk=sh-sci.4,115200 root=/dev/mmcblk0p2 [ 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: 496MB = 496MB total ...