ARM用Linuxカーネルをソースからビルドする

LinuxカーネルをARMシステム用にクロスビルドする方法を紹介します。

ターゲットは、ARMエミュレーションのページで紹介したQEMU上で動作するversatileシステムです。ARMエミュレーションではビルド済みのカーネルイメージを使用しましたが、本ページではソースからビルドしてみます。QEMUで動作確認ができますので、いくらでも失敗できます。気軽に試してみてください :-)

ビルド環境の用意

ビルドに必要なツールチェインは、ARMクロス開発環境構築のページを参照してインストールしてください。

ツールチェインの他に、カーネルの設定をするのにlibncursesが必要になります。Ubuntu 9.04の場合、libncurses5-devというパッケージ名になります。Debian Lennyなどの場合はそれぞれのパッケージをインストールしてください。
$ sudo apt-get install libncurses5-dev

カーネルソースの取得

Linuxカーネルのソースコードは、Debian Lennyで使用されているものを使用します。カーネルのバージョンはlinux-2.6.26です。

Debian packagesのページからlinux-sourceパッケージを検索すると、linux-source-2.6.26のページにたどり着きます。
ページの右側にある「ソースパッケージをダウンロード」というところのリンクから、ソースアーカイブとパッチをダウンロードします。

$ wget http://security.debian.org/debian-security/pool/updates/main/l/linux-2.6/linux-2.6_2.6.26.orig.tar.gz
$ wget http://security.debian.org/debian-security/pool/updates/main/l/linux-2.6/linux-2.6_2.6.26-15lenny3.diff.gz

ソースアーカイブを展開し、パッチを適用します。
$ tar xzvf linux-2.6_2.6.26.orig.tar.gz
$ cd linux-2.6.26/
$ zcat ../linux-2.6_2.6.26-15lenny3.diff.gz | patch --dry-run -p1 | grep versatile

カーネルの設定

カーネルソースディレクトリで、make xxx_defconfigを実行すると設定ファイルに記述してあるデフォルト設定を適用できます。デフォルト設定ファイルは、arch/arm/configs/ディレクトリにあります。verstile用のデフォルトコンフィグを適用するには、以下のようにします。
$ make ARCH=arm versatile_defconfig

次に、make menuconfigで設定の変更をおこないます。
QEMUで起動できるようにするため、EABI、SCSIディスクやファイルシステム(EXT3, tmpfs, Inotify)、RTCの設定をおこないます。

設定メニュー画面に入るには、以下のようにします。
$ make ARCH=arm menuconfig

以下の設定を追加してください。

Kernel Features  --->
  [*] Use the ARM EABI to compile the kernel

Bus support  --->
 PCI support
Device Drivers
  [*] Real Time Clock  --->
    [*]   ARM AMBA PL031 RTC

  SCSI device support  --->
    <*> SCSI disk support
    [*] SCSI low-level drivers  --->
    <*>   SYM53C8XX Version 2 SCSI support

File systems
  <*> Ext3 journalling file system support
  [*]   Ext3 extended attributes (NEW)

  [*] Inotify file change notification support
  [*]   Inotify support for userspace

カーネルのビルド

設定が完了したら、ビルドをおこないます。ビルドの際には、CROSS_COMPILE にクロスツールチェインのプレフィックスを設定することで、特定のツールチェインを使うように指定できます。

$ make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi-

ビルドが完了すると、圧縮イメージがarch/arm/boot/zImageにできあがります。

実行

ビルドしたカーネルイメージを使用して、システムを起動します。ユーザランドとinitrdはARMエミュレーションのフルシステムエミュレーションと同じものを使います。

$ qemu-system-arm -M versatilepb -kernel arch/arm/boot/zImage -initrd initrd.img-2.6.26-1-versatile -hda debian_lenny_armel_small.qcow -append "root=/dev/sda1"

OABIでカーネルをビルドするには

上記で示した方法は、EABIでカーネルをビルドする方法です。OABIでビルドしたい場合は、カーネルの設定で"[*] Use the ARM EABI to compile the kernel"の設定を外し、カーネルのビルドでCROSS_COMPILE にarm-linux-gnu- を指定してください。

Comments