Mac OS X 用 ARM クロスコンパイラで SheevaPlug のカーネルをコンパイルする

Kernel.org で Linux カーネル 2.6.30-rc7 が公開されている。そこで SheevaPlug のカーネルを 2.6.30-rc7 にしてみる。
前回 2.6.30-rc5 のカーネルを SheevaPlug 用にコンパイルにしたときは Marvell が提供していた Linux 用クロスコンパイラを使った。Linux ホストには VMware の上で動作する CentOS5 を使っていたのでいろいろと多少不便を感じていた。また VMware の Linux を立ち上げただけで MacBook のファンがフル回転で回り続けることがあり結構気になる。
そこで Mac OS X 用の ARM クロスコンパイラを作成し、それを使って SheevaPlug のカーネルをコンパイルすることを考えてみた。

ところが、u-boot の mkimage を Mac OS X 上でコンパイルできなかったので、結局 uImage までの作成を全て Mac OS X 上で行うことはできなかった 😉
(仕方ないので zImage まで作って uImage への変換は Linux で行うことにした)

以下、その作業記録:

コンパイラやリンカは以下のバージョンのものを使用した:
– gcc-4.3.3.tar.bz2
– binutils-2.19.1.tar.bz2

MacPorts でコンパイルに必要なライブラリをインストール:
$ sudo port install gmp
$ sudo port install mpfr

(他にもコンパイルに必要なライブラリがあったかもしれない)

binutils のコンパイル:
$ binutils-2.19.1
$ mkdir build
$ cd build
$ ../configure –prefix=/opt/cross_arm/ –target=arm-none-linux-gnueabi –disable-nls
$ make
$ sudo make install

arm-none-linux-gnueabi-* を使えるようにパスを通しておく:

$ PATH=/opt/cross_arm/bin/:$PATH

gcc のコンパイル:

$ cd gcc-4.3.3
$ mkdir build
$ cd build
$ ../configure –target=arm-none-linux-gnueabi –prefix=/opt/cross_arm/ –disable-nls –enable-languages=c,c++ –without-headers –with-gmp=/opt/local/ –with-mpfr=/opt/local/
$ make all-gcc
$ sudo make install-gcc

SheevaPlug_Host_SWsupportPackageLinuxHost.zip に入っている gcc.tar.bz2 を展開する。この中に入っている libgcc.a を以下の場所にコピーする:

$ sudo cp LinuxHost/gcc/lib/gcc/arm-none-linux-gnueabi/4.2.1/libgcc.a /opt/cross_arm/lib/gcc/arm-none-linux-gnueabi/4.3.3/

Linux ホストにある /usr/include/elf.h を /opt/local/include/ にコピーする (インクルードパスに含まれているのであればここでなくても良い)。また elf.h の #include <features.h> をコメントアウトしておく。

Mac OS 版 mkimage を作成を試みた。ftp://ftp.denx.de/pub/u-boot/ から新しそうなものを取ってくる。ここを参考に mkimage を作成してみるが、エラーが出てコンパイルできなかった。とりあえず uImage 化は Linux で行うことにする。

Linux 2.6.30-rc7 の mv643xx_eth にはバグがあり、取ってきた rc7 のソースでは eth が起動しない。起動途中でネットワークインタフェースを立ち上げた場合には以下のメッセージ付近で停止してしまう:

* Loading hardware drivers… mv643xx_eth_port mv643xx_eth_port.0: coherent DMA mask is unset
net eth1: can’t allocate rx ring (2048 bytes)
kernel BUG at include/linux/netdevice.h:420!
Unable to handle kernel NULL pointer dereference at virtual address 00000000

Marvell が公開している orion git修正パッチが公開されているのでこれを kirkwood 用のソースに適用しておく。

Mac OS X 用クロスコンパイラを使い、以前書いた方法に従って Linux 2.6.30-rc7 をコンパイルする:

(省略)
mkimage が使えないので zImage までを作成:
$ make ARCH=arm CROSS_COMPILE=/opt/cross_arm/bin/arm-none-linux-gnueabi- zImage
(省略)

Linux の mkimage を使って uImage 化する:

$ mkimage -A arm -O linux -T kernel -C none -a 0x00008000 -e 0x00008000 -n ‘Linux 2.6.30-rc7’ -d zImage uImage-2.6.30-rc7

カーネルモジュールのコンパイル:

$ make ARCH=arm CROSS_COMPILE=/opt/cross_arm/bin/arm-none-linux-gnueabi- modules

ERROR: “xt_rateest_lookup” [net/netfilter/xt_rateest.ko] undefined!
ERROR: “xt_rateest_put” [net/netfilter/xt_rateest.ko] undefined!

というエラーが出たが、もう一度モジュールをコンパイルしてみると次は出なくなった。

Mac OS X 用のクロスコンパイラから作成した Linux カーネルとモジュールを SheevaPlug にインストールして立ち上げる:

Marvell>> set bootcmd ‘mmcinit; ext2load mmc 0:1 0x800000 /uImage-2.6.30-rc7; bootm 0x800000’
Marvell>> saveenv
Marvell>> reset

dmesg の先頭にカーネルコンパイルに使った gcc のバージョンが記載されているので、今回作成したクロスコンパイラのバージョンと合っているか確認しておく。

広告

タグ: ,

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中


%d人のブロガーが「いいね」をつけました。