uClinux for H8/300H

[English]

uClinux for H8/300H Project Homeへ、移転しました。
uClinuxをH8/300Hに移植しました。
現在はGDBのシミュレータ上で動作しています。
秋月の H8/3068ボードでの起動に成功しました。
H8/3068ボードでの起動方法

シングルユーザーでshが起動するようになりました。 コマンドの実行も出来ます。
マルチユーザーモードでログイン出来るところまでたどりつきました。 長い道のりだった…。


スクリーンショット

uClinux for H8/300H
Flat model support (C) 1998,1999 Kenneth Albanowski, D. Jeff Dionne
Calibrating delay loop.. ok - 5.12 BogoMIPS
Memory available: 3832k/4080k RAM, 515k/1024k ROM (2296k kernel data, 509k code)
Swansea University Computer Society NET3.035 for Linux 2.0
NET3: Unix domain sockets 0.13 for Linux NET3.035.
Swansea University Computer Society TCP/IP for NET3.034
IP Protocols: ICMP, UDP, TCP
uClinux version 2.0.38.1pre3 (ysato@vc6300cb1) (gcc version 2.95.3 20010315 (release)) #286 2002年 1月23日(水) 02時18分59秒 JST
Hitachi SCI driver version 0.01
hitachi-sci.c(1465): info=2178fe num=0
ttySC0 at 0xffffb0 (irq = 52 - 55)
hitachi-sci.c(1465): info=217a02 num=1
ttySC1 at 0xffffb8 (irq = 56 - 59)
hitachi-sci.c(1465): info=217b06 num=2
ttySC2 at 0xffffc0 (irq = 60 - 63)
Ramdisk driver initialized : 16 ramdisks of 4096K size
Blkmem copyright 1998,1999 D. Jeff Dionne
Blkmem copyright 1998 Kenneth Albanowski
Blkmem 1 disk images:
0: 82496-9E895 (RO)
PPP: version 2.2.0 (dynamic channel allocation)
TCP compression code copyright 1989 Regents of the University of California
PPP Dynamic channel allocation code copyright 1995 Caldera, Inc.
PPP line discipline registered.
SLIP: version 0.8.4-NET3.019-NEWTTY (dynamic channels, max=256).
CSLIP: code copyright 1989 Regents of the University of California.
Open of blkmem arena 0 at 82496, length 1c400
VFS: Mounted root (romfs filesystem) readonly.
init: Booting to single user mode.
# hello
Hello World
# 

BogoMIPSはクロック16MHz(16bit bus/2cycle)で計算しています。


お知らせ

長くなったら消していきます。

2002年10月9日

uClinux for H8/300H Project Home に、引っ越します。流浪のページですね。
ここの内容は古文書状態になってます。最新情報は↑。消すのは面倒なので残しておきます。

2002年5月3日

TCPとUDPのチェックサムを間違えるバグが見つかりました。
include/asm-h8300/checksum.hをCVSの最新版に入れ換えてください。
これでネットワークがまともにつながるようになります。
今後、開発ネタは、 uClinux for H8/300H Project Homeに持っていきます。 ここのドキュメントは古くなってきてるし…。

2002年4月29日

メモリリークの原因がわかりました。 なんで動くんだぐらいのバグなので、パッチを作りました。
uClinux-H8-020429.diff.gzです。
ネットワークは安定しました。簡単に負荷テストを行ってみましたが、 問題なく動いてます。

2002年4月28日

ネットワークが使えるようになりました。
ただ、どこかでメモリリークしてるらしいので、そのうち死んでしまいます。

2002年4月23日

RTL8019ASがneドライバで見えるようになりました。
設定関係がやたら不安定なので、まともに動いているとは思えませんが。
sourceforge.jp にプロジェクト登録したので、ソースがほしい人は、 CVSから持っていってください。
プロジェクトホームはまだ出来てません。 21日の分は、uclinux.orgにも入っています。

2002年4月21日

カーネルのパッチを更新しました。 秋月ボードで動いているものです。 H8/3068ボードでの起動方法 のページから持っていってください。

2002年4月20日

またまた久々の更新です。近況報告的な更新ですが、 実機での起動を確認しました。
H8/3068ボードでの起動方法

公開中のパッチ

現在公開しているパッチです。いらない物は消していきます。

コンパイル・実行方法

先頭に戻る

uClinux for H8/300H Toolchain(といっていいのか?)一覧

カーネル・ライブラリ・ユーザーランドをコンパイルするために以下のプログラムが 必要になります。 先頭に戻る

入手先

持っていない場合は、以下の場所から入手してください。

パッチ

必要な物を持っていってください。 先頭に戻る

ビルド方法

gcc/binutils/gdbは、ごく普通のクロス開発環境の構築なので(パッチがあるけど)、 よく分からない場合は、もっと親切に書いてあるページを探してください。

先頭に戻る

カーネルのコンパイル

  1. ソースツリーの展開
    uClinux-2.0.38.1pre7用パッチは、開発を終了しました。 CVSのソースを使ってください。
    ということで、この部分の記述は古くなっています。
    $ tar xzf linux-2.0.38.tar.gz
    $ cd linux-2.0.38
    $ zcat ../uClinux-2.0.38.1pre7.diff.gz | patch -p1
    $ zcat ../uClinux-H8-020203.diff.gz | patch -p1
         

    これでuClinux-h8のソースツリーが展開されます。

    注:以前公開したパッチとはファイルの配置が違うので、かぶせることは出来ません。

    おまけ(CVS版)
    2月4日以降のパッチは、CVS最新版用に作ってあるので、CVSから最新ソー スツリーを取ってきてパッチを当ててください。持ってくる方法は、 ここに書いてあります。 パッチがRejectされたら、自分でなんとかしてください。ついでに連絡 をもらえるとうれしかったりします。

  2. カーネルの構築

    注1:最後のターゲットはallを指定してください。それ以外を指定してもコンパイル 出来ません。
    注2:デフォルト以外のコンフィグレーションはぜんぜんテストしていないので、 変更する場合は、注意してください。
    注3:標準の設定で、デバッグ情報を生成するようになっています。 そんなもんいらんわ、という人はarch/h8300/Rules.makeのCLFAGSの-gを 削除してください。

先頭に戻る

ライブラリのコンパイル

カーネルだけ動いても何も出来ないので、libcとしてuClibcを移植しました。
newlibをuClinuxに乗せようと一瞬考えましたが、 かなり大変そうなので、素直にuClibcに落ち着いています。
既に0.9.8がリリースされているようですが、何故かダウンロードできないので、 0.9.5のパッチになります。 0.9.8か、スナップショット版を使ってください。 (2002/01/30追加) 0.9.8パッチも作りました。
2002/02/03以降のスナップショットはH8/300パッチが取りこまれています。
0.9.9がリリースされました。H8/300サポートが入ったので、パッチなしでコン パイル出来るようになります。
と思っていたら、ptraceが可変長引数の罠にはまって動かないので、パッチが いります。ごめんなさい。
0.9.8までのパッチは削除しました。
(2002/03/08追加)ptraceが動かない問題はCVSの最新版では修正されています。 スナップショット or CVSから取ってくるか、 次の(0.9.10?)リリースを待ってください。
0.9.9へのパッチは、次のリリースまで残して起きます。

ソースの展開

  1. uClibc-0.9.9.tar.bz2 を、ダウンロードして展開してください。なぜか404の時があります。他に上がっ ているところを探したほうがいいかもしれません。
  2. ptrace.diff をダウンロードして、パッチを当ててください
先頭に戻る

コンフィグレーション&インストール

ここから先の手順は、私もよく分かっていません。 uClibcに詳しい人は、どんどん突っ込んでください。

  1. extra/Configs/Config.h8300をトップディレクトリにConfigという名前で コピーしてください。
  2. Configの変数を環境に合わせて変更してください。 他にもありそうですが、とりあえずこの3つを環境に合わせて設定すれば ライブラリは出来るようです。
  3. make
  4. rootになってmake install

インストールの所は実際にやってないので、かなりあやしい物があります。 間違って標準のlibcを上書きしないように注意してください。

先頭に戻る

ユーザーランドのコンパイル方法

普通にコンパイル、リンクできますが、以下の点を注意してください。

uClibcを構築すると、h8300-uclibc-gccというコンパイラドライバが出 来るので、使うと楽できるかもしれません。

この辺になるとH8に依存する部分はほとんど無いので、 uClinuxで調べれば大概の問題は解決すると思います。
というか、この辺はぜんぜん分からないので、H8に固有の問題以外は書けません。ごめんなさい。

おまけ

uCsimmのユーザーランドが、 uC-src-0.9.1.tar.gz にあったので、取ってきてコンパイルしてみました。
ライブラリのバージョンがあわないので、#includeとMakefileを直した ら、、ipfwadmとboottools以外はコンパイルできました。
(boottoolsはuCsimm専用なので無理、ipfwadmはIP Masquarade入れれば 通るんじゃないかと思う)
initとshは実際に動いています。

先頭に戻る

ルートイメージファイルの作成

genromfsで作ってください。で終わるのはあんまりなので、もう少し詳しく 説明します。
genromfs(とromfs)の説明は、カーネルソースのDocumentationの中にあるらしいので、 細かいことはそっちを読んで下さい。
適当なディレクトリを作って、そこをルートとして ファイルを置いてください。
ちなみに、uClinux-H8が起動するのに最低限必要なファイルは、 (当然/dev/ttyS0はmknodで作る。initは実際に動作するプログラム)
です。普通のlinuxと同じです。
で、必要なファイルがそろったら、
$ genromfs -f 適当な名前 ルートにしたディレクトリ
で、イメージファイルを作ってください。

ルートイメージの雛型として、テストに使っているルートイメージの元を 置いておきます

先頭に戻る

ルートイメージのコンバート

こっちが本題です。

で、作ったルートイメージをカーネルにリンクする必要がありますが、genromfsが吐き出すファイルは生バイナリなので、そのままリンクできません。
力技で.oに変換できないことも無いですが、めんどくさくなったので、objcopyで変換できるようにしました。

h8300-hitachi-hms-objcopy --adjust-vma=0x88000 --adjust-arch=h8300h \
--adjust-mach=2 --add-section .rootimg=ルートイメージ(バイナリ) --remove-section .data \
-I binary -O coff-h8300 ルートイメージ(バイナリ) ルートイメージ(オブジェクト)

という(長い)コマンドで、.oに変換できます。
出来上がった.oファイルをカーネルソースのトップディレクトリにおいて、 makeすると新しいルートイメージの組み込まれたカーネルが出来上がります。

先頭に戻る

ルートイメージの配置

ルートイメージを別に持ちたい。という要望は多数出そうなので、どこを変更すればいいかというお話です。
drivers/block/blkmem.cが、ROMFSのドライバで、ルートイメージはここの管理下に 置かれています。
で、area_t構造体が、ディスクイメージのアドレスを管理する構造体なので、 ここの初期値を適当に修正してしまえば、どこでも自由に配置できます。
現状は、.rootimageセクションに配置されたデータが、ルートイメージということ になっています。詳しいことは、blkmem.cと arch/h8300/platform/h8300h/generic/rom.ldを見てください。

先頭に戻る

実行する

単純にgdbで実行しても、コンソールがないので何も出てきません(=何も出来ません)。
次のような手順で起動させてください。
  1. ターミナルを2つ用意してください。gdbとuClinuxの端末になります。
  2. パッチを当ててあるgdbでlinuxを指定して起動します。
    $ h8300-hitachi-hms-gdb linux
         
  3. target simでシミュレータに設定するとSCIシミュレーション用の疑似端末が 割り当てられて、端末名(多分ttya0)が表示されます。
    (gdb) target sim
    SCI0=ttya0
    (gdb)
         
  4. もう1個のターミナルで、適当なシリアル端末(cuとか)を使って、 疑似端末に接続してください。
    これがuClinuxのコンソールになります。
  5. loadしてください。
  6. カーネルパラメータを渡したい場合は、ここでセットしてください。
    アドレスは、標準のldscriptの場合0x5ffe00からです。
  7. runすると、カーネルが起動します。
  8. uClinuxのターミナルに移って、適当に遊んでください。
  9. 止めたくなったら、gdbにSIGINT送って止めてください。 shutdownすると戻るなどということはやってません。
先頭に戻る

注意事項

というほどの物ではないですが、念のため。 先頭に戻る

今後の予定(Todo?)

カーネル本体の移植は大体終わったような気がするので、これからのことを適当にまとめます。 (優先度順)
  1. 実機でのテスト

    秋月のボードは購入資金を用意しているうちに売り切れてしまったので、 次回入荷待ちです。
    自分で作るという選択肢もありますが、 手間を考えると出来ている物を買った方が早そうなので待ちます。
    もっとも、ブートローダーの準備がまだ出来ていないので、 物があってもすぐにはテストできません。
    次は5月らしいので、それまでには準備できるでしょう。

    作業開始から1年、ようやく動きました。

  2. デバイスドライバの移植

    上の項目とも関係がありますが、最低限ne.cは動かしたいところです。 回路図はあるので、コンパイルが通るぐらいのところまではいじれると思いますが。
    neの移植が終わりました。割り込みまわりを直したら動いてしまったので、 何もしていないのと同じですが(笑)。
    内蔵のI/O用ドライバも用意したいところです。

  3. H8S対応

    いまのコードでも動くはずですが、H8Sの拡張機能を使えるようにしたいので。
    実機を用意できるかどうかが問題です。

  4. ELFバイナリに移行

    世の中の流れ的にはこっちなので(uClinuxもH8以外みんなELFになっている)、 適当なところで移行しないと・・・
    時期的にはbinutils-2.12(になるのか)がリリースされたら移ろうと思っています。

これ以外にもありますが、さしあたってはこんなところです。

更新履歴

+メモみたいなもの?
長くなったので最後にもってきました。
2001年10月10日公開
2002年 1月27日いろいろ更新(カーネル、ライブラリ、ユーザーランド)
2002年 1月28日rootimage.o → rootimage.o.gzに変更。少し書き足した。
英語ページ公開。 超訳なので、誰か査読してください。
2002年 1月30日uClibc-0.9.8パッチ公開。0.9.5のほうもしばらく残します。
ページレイアウトを少し修正。
2002年 2月 2日カーネルパッチ更新。シグナルが腐ってました。
2002年 2月 3日カーネルパッチ更新。execveが遅いのを直しました。
念のため、昨日のバージョンも残しておきます。 読めないプログラムがあったら、試してみてください。
2.0.38.1pre7ベースのパッチは、致命的な問題がなければ、 これで終わりにします。
少し直したらCVSに入れてもらうので、 そっちを見てください。
2002年 2月 4日coff2flt-0.5.patch更新。 表示を少し変えただけなので、 無理に更新する必要はありません。
カーネルCVS最新用のパッチを追加。 uclinux.orgにも送ってあるので、 そのうちマージされるでしょう。
uClibcが本家にマージされました。 最新スナップショットからパッチは不要になります。 ということで、0.9.5の記述を削除しました。
ふと気がついたら、3日連続で更新している・・・。
2002年 2月12日 カーネルパッチ更新(CVS先頭)を追加。
ptraceが使えるようになります。&シグナル まわりを修正しました。
ptraceは実験的な実装です(仕様を満たしているか どうかよくわからない)。おかしな所があったら、 指摘してください。何も来ない場合は、今の実装を H8バージョンの仕様にします。
いつの間にか(おい)uClibcの0.9.9がリリース されていたので、uClibcの部分を更新。パッチを更新 (と言うより追加?)しました。
2.0なカーネルの移植はだいたい終わりかなと 思っているところです。実機に載せるのが 残っていますが、秋月のNIC付き3067ボードが 出るまで待ち状態です。
しばらく謎作業するので、 何もなければ更新しません。
また長くなったな・・・別なところに 書いたほうがいいかな・・・
2002年 2月13日しばらく更新しないとか言っておきながら、 次の日に更新してるし・・・
カーネルのコンパイル方法のところで書き 忘れていることがあったので、追加しました。 ついでにCVS版の説明も少し書きました。
今度こそしばらく更新しません(多分・・・)
2002年 3月 9日予告通り久々に更新。

久々に更新しました。ページレイアウトをいろいろいじってあります。

  • お知らせ+パッチの一覧の追加
  • 予定の追加
  • 更新履歴を後ろに移動しました。

uClinux.orgにて、 Source Distribution が公開されています。カーネルソース・ライブラリ・ユーザーランドが まとめられているので、これを使った方が楽でしょう。
H8/300Hのコードも入っています。
簡単な説明を用意しました。

H8/300H差分のCVSへのマージ作業が完了しました。最新版がCVSから取得出来ます。 ということで、カーネルとライブラリの差分は基本的に作りません。 必要な時は、CVSから持ってきてください。
ただし、致命的な問題がおきた、マージする前のテスト等の差分は公開するつもりです。

需要があったので、H8/3048他対応のコードを入れました。ただし全然テストしてません。 calibrate_delayの辺りが山。
CPUはカーネルコンフィグレーションで選択できます。
H8/300Hであれば、一覧に無くてもどれかに該当しているはずですが、 データシートで確認できなかったので乗せていません。 情報があれば、追加していきます。

2002年 4月20日またまた久々の更新。
実機で起動しました。 準備にえらく時間がかかりましたが。
ちなみに、移植を開始してからちょうど1年です。 (あれ、1〜2日前だったか?まあ、おおよそということで)
しばらくは更新頻度をあげられると思います。
2002年 4月21日パッチを作りました。
次はne.cの移植かな。
2002年 4月23日neまわりを追記。 sourceforge.jpアナウンス追加
2002年 4月28日ne移植完了。ifattachにくるしめられた。
つぎはmmnommuまわり。安定させないと。
2002年 4月29日結構致命的なバグを発見。よく動いてたな。
直したら、メモリ管理は安定したような気がする。
2002年10月 9日半年ぶり。ここは捨てます。
先頭に戻る
リンクはご自由に
Yoshinori Sato <qzb04471@nifty.ne.jp>
戻る