GNU/Linux on SuperH 開発ツール(rpm)の使用法 杉岡利信 2000/12/3 ライセンス GPLに従います。 完全無保証です。 1. 開発用HOSTの準備 rpm系Linuxの動作するパソコンが必要です。 RedHat 6.2 以外のディストリビューションを使用するときは、 ライブラリのバージョンなどの関係で配布しているi386バイナリが動作しない 場合があります。このような場合は SRPM からbuildしなおしてみてください。 HOSTにインストールするパッケージは以下のとおりです。 binutils---.i386.rpm gcc---.i386.rpm kernel-sh-headers--.noarch.rpm glibc---.noarch.rpm libtermcap---.noarch.rpm ncurses---.noarch.rpm popt---.noarch.rpm slang---.noarch.rpm tcl---.noarch.rpm newt---.noarch.rpm , の部分はそのときの最新版を使用してください。 の部分は CPU と endian に応じて sh3-linux -- sh3 little endian sh3eb-linux -- sh3 big endian sh4-linux -- sh4 little endian sh4eb-linux -- sh4 big endian の4種類あります。ツールのバイナリrpmはこれらに対応して binutils-sh3-linux-001118-1.i386.rpm のような名前になっていますので、必要なものだけインストールします。 インストールされるファイルの一覧を確認するには rpm -qlp binutils-sh3-linux-001118-1.i386.rpm インストールを実行するには rpm -i binutils-sh3-linux-001118-1.i386.rpm 削除するときは rpm -e binutils-sh3-linux-001118-1.i386.rpm とします。 例えば、sh3-linux 用のパッケージの場合は /usr/sh3-linux/bin クロスのas,ld,ar,ranlib,strip,nm,objdump ... /usr/sh3-linux/lib ターゲット用ライブラリ。 *.a, *.so /usr/sh3-linux/include ターゲット用ヘッダーファイル /usr/lib/gcc-lib/sh3-linux/2.97 クロスgcc の実行ファイル,libgcc,include ... にインストールされます。 2. Linux Kernel をターゲット上で実行する 2.1 カーネルイメージの作成 まずカーネルのイメージを作成します。 2000年12月3日現在で最新のソースとパッチは、 ftp://ftp.m17n.org/pub/super-h/original/linux-2.4.0-test11.tar.bz2 ftp://ftp.m17n.org/pub/super-h/linux-sh-20001127.diff.gz です。カーネルを適当なディレクトリに展開し、パッチを適用します。 bzip2 -dc linux-2.4.0-test11.tar.bz2 | tar x cd linux zcat ../linux-sh-20001127.diff.gz | patch -p1 新しいコンパイラでコンパイルするために、arch/sh/Makefile を修正します。 次のような個所をみつけて tool_prefix = sh-linux-gnu- ifdef CONFIG_CPU_LITTLE_ENDIAN CFLAGS += -ml AFLAGS += -ml # LINKFLAGS += -EL LDFLAGS := -EL else CFLAGS += -mb AFLAGS += -mb # LINKFLAGS += -EB LDFLAGS := -EB endif このように修正してください。 #tool_prefix = sh-linux-gnu- # <-- コメントアウト ifdef CONFIG_CPU_LITTLE_ENDIAN tool_prefix = sh3-linux- # <-- 挿入 CFLAGS += -ml AFLAGS += -ml # LINKFLAGS += -EL LDFLAGS := -EL else tool_prefix = sh3eb-linux- # <-- 挿入 CFLAGS += -mb AFLAGS += -mb # LINKFLAGS += -EB LDFLAGS := -EB endif これでコンパイルの準備ができました。 カーネルのコンフィグレーションと依存関係の解析を make ARCH=sh menuconfig make ARCH=sh dep で行います。 make ARCH=sh zImage で圧縮されたカーネルイメージが作成されます。 2.2 ターゲットにカーネルをロードする できあがったカーネルを実際に実行させるためにはそれぞれのターゲット用に作成された Boot ROMによって、zImageをメモリ上にコピーしたあと開始アドレスにジャンプします。 Boot ROM で実行する具体的な手順は次のようになります。 CONFIG_MEMORY_START はカーネル作成時に指定したメモリ開始アドレスです。 (1) BSC など、ハードウェアの初期化を行う。 最小限、メモリと割り込み関連の初期化が必要です。 (2) CONFIG_MEMORY_START+0x80000000 - CONFIG_MEMORY_START+0x80001fff の範囲を 0x00 でクリアする。 (3) CONFIG_MEMORY_START+0x80001100 にカーネルコマンドラインを書き込む。 カーネルコマンドラインは終端が0x00のASCII文字列です。 (4) CONFIG_MEMORY_START+0x80210000 にzImageをコピーする。 zImage は、不揮発性のメモリかHDDなどの2次記憶からロードします。 (4) CONFIG_MEMORY_START+0x80210000 にジャンプする。 これで、カーネルの起動後、VFS が root file system をマウントできなくて kernel panic になれば、一応成功です。 Boot ROM の例は、g新部氏の SH-IPL+g を参考にしてください。 ftp://ftp.m17n.org/pub/super-h/sh-ipl+g-2000-11-26.tar.gz Compact Flash 上にzImage をおいておくなら、g新部氏作成の SH-LILO が便利です。 http://www.m17n.org/linux-sh SH-LILO のrpm は http://www.sh-linux.org/rpm-index-j からダウンロードできます。 1番目のシリアルI/F(SCI)をコンソールとして使うときは、カーネルコマンドラインに console=ttySC0,115200 と指定すればよいでしょう。これで115200bps(8bit, non-parity)のターミナル上に 起動メッセージが表示されます。 make するとき ARCH=sh の指定を毎回忘れずに行う必要がありますが、これが面倒だという人は 展開されたカーネルの先頭ディレクトリにある Makefile の ARCH := $(shell uname -m | sed -e s/i.86/i386/ -e s/sun4u/sparc64/ -e s/arm.*/arm/ -e s/sa110/arm/) の行を ARCH=sh に書き換えてください。 3. ターゲット用ファイルシステムの作成 ターゲットがroot file systemとしてマウントするファイルシステムを 作成する必要があります。 開発HOST上の 以下にファイルシステムを作成するものとします。 作業は、root 特権で行う必要があります。 ディレクトリの作成とrpm データベースの初期化 mkdir -p /var/lib/rpm rpm --root --initdb その後、インストールするそれぞれのrpmに対して rpm --root -ivh --force --nodeps --ignorearch --noscripts xxx.sh3.rpm でインストールできます。ここで使用しているオプションは --root ここをrootとしてrpmを実行する --force 強制的にインストールする --nodeps 依存関係を無視する --ignorearch ターゲットアーキテクチャを無視する --noscripts スクリプトを実行しない という意味です。詳しくはrpmのマニュアルなどを参照してください。 とくに --root を忘れると、開発HOST上の重要なファイルをターゲット用の ファイルと置き換えてしまいますので、十分注意してください。 /dev は rpm として準備していません。HOST の /dev をコピーするのが簡単です。 cp -a /dev / その後、sh 固有のデバイスを作成します。 cd /dev mknod ttySC0 c 204 8 mknod ttySC1 c 204 9 mknod ttySC2 c 204 10 最初は basesystem filesystem setup initscripts glibc libtermcap ncurses SysVinit bash mingetty util-linux e2fsprogs textutils fileutils sh-utils procps inetd telnetd lilo をインストールしてみてください。以下の etc/fstab, etc/sysconfig/network, etc/sysconfig/network-scripts/ifcfg-eth0, etc/inetd.conf などの設定ファイルは手で編集します。 4. ターゲットにマウントするファイルシステム 4.1 NFS root ターゲットがLANを使えるときは、 をexportしてNFS rootで マウントすることができます。 をexportするためにはHOST側の/etc/exports に /(rw,no_root_squash) の行を追加します。実際にはたとえば /home/hoge/export 192.168.0.0/255.255.255.0(rw,no_root_squash) のようになります。netmask と '(' の間にスペースを入れないように注意してください。 target のipアドレスはなんらかの方法で名前に変換できる必要があるかもしれません。 dns によってターゲットのipアドレスが逆引きできない場合は/etc/hostsに登録するのが 簡単です。 192.168.0.180 target-name.domain target-name のような行を /etc/hosts に追加してください。 nfsd が起動していないなら、 /etc/rc.d/init.d/nfs start でNFSサービスを起動します。すでに起動しているときは、 /usr/sbin/exportfs -rv で /etc/exports に追加したエントリが実際に export されます。 4.2 Compact Flash (CF) HOST上でをすべてCF上のパーティションにコピーすれば ターゲット上でroot file system としてマウントできます。 例えばCF が/dev/hdc として認識されているものとしてHOST上で fdisk /dev/hdc として、hdc1 をLinux native パーティションとして作成します。 mke2fs /dev/hdc1 として /dev/hdc1 を ext2 で初期化し mount /dev/hdc1 /mnt cp -a /* /mnt とやって、ターゲット用のファイルをすべてCFにコピーします。 その後、/mnt/etc/fstab をターゲットにあうように修正します。 SH-IPL+g でブートすれば、SH-LILO を使用することが可能です。 この場合は、カーネルイメージ(zImage) と SH-LILO で作成される ブートレコード(boot.b) を cp zImage /mnt/boot/vmlinuz cp boot.b /mnt/boot のようにして、CF の /boot にコピーしたあと /mnt/etc/lilo.conf をターゲットにあわせて編集し /sbin/lilo -r /mnt としてインストールします。 このようにHOST上でLILOを実行する場合のlilo.conf は たとえば次のようになります。 ------- ここから -------- linear # Cross LILO # Actually, it's /dev/hda boot = /dev/hdc disk = /dev/hdc bios=0x80 # delay = 30 append = "mem=16M console=ttySC0,115200" image = /boot/vmlinuz label = linux root = /dev/hda1 read-only ------- ここまで -------- linear は SH-IPL+g が LBA しかサポートしないので必要です。 /dev/hdc は HOST 上で CF として認識されているデバイスで、 ターゲット上では、/dev/hda がブートデバイスとなっています。 オリジナルのSH-LILOでは、append は無視されますが、 rpm 版では append に記述したパラメータがカーネルに渡されます。 "append=" のなかに "mem=" と "console=" の記述は必ず行ったほうがよいでしょう。 bios=0x80 の指定は、ブートデバイスを /dev/hda にするための記述です。 umount /mnt でCFの作成は終わりです。この CF をターゲットに装着してブートすれば成功です。