SheevaPlug の mkimage を使って zImage から uImage に変換する

6月 1, 2009

前回は Mac OS X 上で SheevaPlug のカーネルのコンパイルを行えるようにした。mkimage は Mac OS X でコンパイルできなかったので、uImage への変換は SheevaPlug 上で行うことにした。
まず apt の中を探してみたところ、すでに登録されていた。なので簡単にインストールすることができる:

# apt-get install uboot-mkimage
# 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

無事立ち上がってきた。
今後カーネルをコンパイルする場合は、Mac OS X 上で zImage までコンパイルして、これを SheevaPlug 上の mkimage で uImage 化したものでカーネルを置き換えるといった手順にしよう。

広告

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

5月 31, 2009

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 のバージョンが記載されているので、今回作成したクロスコンパイラのバージョンと合っているか確認しておく。

SheevaPlug の所感と今までのまとめ

5月 18, 2009

SheevaPlug を一通り触れてみた所感と、今までのまとめを簡単に書いてみます。

まず SheevaPlug の優れた特徴として以下のものが挙げられると思います:
– 低価格 ($99 + 送料)
– 低消費電力 (24 時間運転でも電気代があまりかからない)
– ファンレス
– ホームサーバとして十分な性能を持つ CPU (1.2GHz) と、十分なメモリ搭載量 (512 MB)
– ケースの中にちゃんと収まっている (ボードむき出しじゃない)
– USB, 1GbE, SDIO, Serial console, JTAG を標準搭載
Kernel.org で配布されているカーネル (2.6.30 以降) をそのまま使える
(安心してカーネルバージョンアップに追随していける)

上から分かるように開発に必要なものは一通り揃っており、お手軽に組み込み Linux を体験することができます。組み込み Linux を扱ったことがない人にとっても敷居は低いものになると考えられます。私自身、組み込み Linux を触ってみるのは始めてでしたが SheevaPlug のおかげでハードウェア関係で苦労することもなくいろいろと勉強になりました 🙂
例えば以下のことが学べます:
– ARM 系の CPU を知る
– クロスコンパイラの使い方を知る
SheevaPlug 用のクロスコンパイラは提供されているのですぐにコンパイル環境が整います!
– u-boot を知る (組み込み Linux で使われているブートローダ)
Grub や LILO とは一味違ったブートローダを知ることができます。
– フラッシュメモリに関する知識
フラッシュメモリの特徴とは? フラッシュメモリで使われる JFFS2 というファイルシステムの特徴とは?
そんなことを知るきっかけになります。(SSD などが台頭してきている今、フラッシュメモリに関する蘊蓄はきっと役立つでしょう)

SheevaPlug はホームサーバとして使うだけでなく、組み込み Linux の入門キットとしても十分な価値があるのではないでしょうか。

これらに加えて PlugComputer を中心に広がっているコミュニティや個人 Blog の盛り上がりは見逃すことができません。コミュニティを中心に SheevaPlug の情報は充実してきており、今後さまざまなアイデアが生まれていくのではないでしょうか。

(ところで Marvell のページで配布されていた開発キットやドキュメント類はどうやら PlugComputer に移ってしまったようです。既にコミュニティの方が先に進んでしまっていたことから、初期の立ち上げとしての役割を果たしたということでしょうか?)

さて SheevaPlug の購入方法ですが、私は DevKit を Globalscale Technologies のフォームから購入しました。購入前に Global Technologies にメールで質問したところ、日本から買う方法で他の方法は無いとのことでした。必要な手続きはほとんどなく、日本からでも簡単に購入することが可能です。
購入用のフォームでは送付先に日本も指定できるようになっています。郵便番号も入力すれば見積もりを取ることができます。数量を変えて見積もりを計算 (Get Estimates ボタンを押す) すると分かりますが、3 個の場合が 1 個あたりの送料が若干高いかも。(もちろん 1 個の場合が一番高く付きます)
支払いは VISA カードで ok です。
SheevaPlug は Fedex で送られてきます。出荷が完了すると Fedex の追跡番号がメールで送られてくるので、Fedex の追跡用ページから今どこらへんを飛んでいるのか確認しながら到着を待ちます。

(ちなみに SheevaPlug の CPU の開発元である Mavell は開発キットやドキュメントの配布を行っていましたが、DevKit 自体の開発やサポートは Globalscale Technologies であり Marvell では行っていないようです。DevKit 以外のバリエーションは他にもあります。)

次に SheevaPlug を使う上で必要になったものを簡単にまとめてみました。

必要なもの (ハードウェア編):
– USB を備えたマシン
USB を通してシリアルコンソールや JTAG の入出力を行う。
(MacBook, Linux, Windows など、どれでもできそう。)
– NFS server
NAND 上の u-boot, カーネル, ファイルシステムの書き換えを行うときに使う。
または何かトラブルがあった時に必要になるかも。
Linux の NFS サーバを使った方が何かとトラブルが少ない。
– tftp サーバ
nfsroot を使って起動するときカーネルは tftp を使って読み込まれる。
u-boot の書き換えにも使う。
– SD カード
SheevaPlug では SD カードから起動することができる。(ただし、u-boot やカーネルの置き換えが必要)
内蔵の NAND は 512 MB しか無いことからルートファイルシステムを大容量の SD カードにしておくと何かと便利。
起動も速い。
– 楊枝 (クリップでも可)
リセットボタンを押すのに使う。

必要なもの (ソフトウェア編):
FTDI ドライバ
USB をシリアルコンソールや JTAG として使うために必要。
Mac OS X でのシリアルコンソールを使う方法はここ
OpenOCD
u-boot を使わずに u-boot の置き換えができる。
デバックなどにも使えるはず (やったことがないけど)。
ARM 用クロスコンパイラ
DevKit として配布されていたものが使える。(CentOS5 x86 で動作することを確認)
– コンソールソフト (screen, minicom, putty,… など)
– SSH クライアント

どれも入手や構築が容易なものばかりだと思います。これらの使い方が分かれば、あとは普通の Linux と同じなので、自分のアイデア次第のホームサーバを構築することができるようになります。

大きなものとしては上の通りですが、その他、細かいものはたくさんあります。それらに関する情報は以下が参考になります。

情報源:
PlugComputer.org
ドキュメント類やコンパイラなどを取得できます。
PlugForum
ログインしないと添付ファイルは見えないらしいので注意。(ログインしたことが無いのでどのようになっているのか正確には知りませんが)
PlugWiki

PlugForum は質疑応答や成功事例の報告がメインとなっています。PlugForum で上がった cool な成功例や FAQ は PlugWiki に逐次追加されていきます。