Upgrade to PRO for Only $50/Year—Limited-Time Offer! 🔥

NetBSD移植の昔話

 NetBSD移植の昔話

1993年に公開されたばかりのNetBSDをX68030に移植した時のことを大まかにまとめてみました。slideshareにアップロードしたものから一部内容を更新しています。

Masaru OKI

March 27, 2018
Tweet

More Decks by Masaru OKI

Other Decks in Programming

Transcript

  1. 16bit~32bitパソコンの時代 (1990年代前半) • いろんなメーカーからいろんなパソコンが出ていた。 • アーキテクチャが製品ごとにバラバラ! ◦ CPUが違う (68000, 80386,

    … 仮想記憶もなかったり貧弱だったり .) ◦ メモリも違う (基本オンボード、増設 RAMは製品ごとに独自規格 ) ◦ 周辺回路も違う (PCIでもISAでもない独自バスが製品ごと、メモリマップも ) ◦ コネクタも違う (キーボードはキー数、プロトコルもそれぞれ違う ) ◦ サウンド機能は豪華だったり貧弱だったり (ビジネス用の製品ではビープ音のみ、など ) ◦ USBはない、マウスは機種によっては標準添付だがオプションの製品も ◦ ハードウェア仕様は書籍で入手、データシートそのものの入手は難しいことも • LANはないわけではないが高価 (10BaseT 8ポートHUBが数万円していた) • インターネット(Web)も黎明期 • ハードウェアは基本的にメーカー純正品か互換品を選択するしかない • OSも基本的にはメーカー提供のもの (主流はx86用のMS-DOS)
  2. 参考: こんな機種がありました シャープ X68000 最初のモデルは1987年発売 CPU: 68000 (後に68030) MEM: 1MB

    (初代) 添付OS: Human68k 価格: 369,000円(初代) 富士通 FM-TOWNS 最初のモデルは1989年発売 CPU: 80386 (後にPentium) MEM: 2MB (初代) 添付OS: TownsOS 価格: 338,000円 (初代) NEC PC-9801 最初のモデルは1982年発売 CPU: 8086 (後に486DX) MEM: 128KB (初代) 添付OS(?): N-BASIC(86) 価格: 298,000円(初代)
  3. 当時のX68000開発環境 • OSはHuman68kという、MS-DOS/m68kみたいなかんじのもの(シングルタスク) • メーカーがスクリーンエディタとアセンブラとリンカを製品に標準添付していた • メーカーがCコンパイラを販売していた • 当時すでにあったgcc (バージョン1.36とか)を移植した個人がいた

    • 高速な互換リンカを作り上げた個人がいた • 高速な互換アセンブラを作り上げた個人がいた • MicroEMACSやviクローンを移植した個人がいた • UNIX互換コマンド(lsとか)やUNIX風シェルを開発した個人がいた • 他のGNUソフトウェアを移植する人もいた (make, awk, sedなど) • UNIXのlibc風のライブラリを作り上げる人たちもいた • TeXを移植する人もいた
  4. X68030 • 1987年に68000 10MHzを搭載し発売されたX68000。 • 途中CPUクロックを16MHzにアップする他は一切変更ないまま 5年が経過。 • 1993年、ついに32bit CPUを搭載した新機種X68030が発売に。

    • 68030はSunのワークステーションでも採用されていた CPU。 • UNIXが動く!! と思ったら、CPUは組み込み向けの68EC030。 • 仮想記憶が実装されていない variantだった。 しかし • 本体内の68EC030はソケットに実装されていた。 • 68030を買ってくれば交換可能! 希望がつながった!
  5. NetBSD移植の流れ 1. ハードウェアの入手 2. ソースコードの入手 3. 開発環境の整備 4. 移植元アーキテクチャの選定 5.

    コンフィグ整理とビルドの確認 6. ブートローダーの開発と起動テスト 7. メモリマップの調整 8. デバイスドライバ(シリアルコンソール)の開発 9. 起動するまで動かす 10. SCSIドライバなどの開発 11. ブートメディア構築 12. init diedとの戦い
  6. 1.ハードウェアの入手 • X68030本体 (68EC030 25MHz, 4MBメモリ) ◦ 秋葉原のツクモパソコン本店で購入。 1993年5月。 •

    68030 • 68881 浮動小数点コプロセッサ ◦ 秋葉原のラジオデパートに、当時秋葉原エレクトリックパーツという店があり、そこで売られていたものを入手。 同じく1993年5月。 デバッグ用のハードウェア (ICE等)は使わなかった
  7. 3.開発環境の構築 • 標準OSであるHuman68k上で、NetBSDをビルドできるようにする ◦ MS-DOSっぽい。A:\CONFIG.SYSとかある。 ◦ ファイル名は標準だと拡張子 3文字だが、UNIXぽくピリオド複数どこでも自由にするソフトがあった ◦ (以前に)シンボリックリンクはなかったが作った。実行属性はなかったが作った。

    • いわゆるクロスビルド環境だが、当時は手軽に構築する手段がなかった • BSD makeをHuman68kに移植 ◦ 既存のツールやライブラリのおかげで、ほぼビルドするだけ ◦ GNU makeではビルドできない。最初は添付シェルスクリプトで作る • a.out(当時はELFではなかった)を出力するgccをビルド • gasやGNU Linkerも用意 (ldはbinutilsに入っていた)
  8. 4.移植元アーキテクチャの選定 • 同じm68kファミリーを使っているアーキテクチャを選ぶ • hp300 or amiga ◦ hp300はHP9000/300シリーズワークステーション ◦

    amigaはコモドール社のパソコン Amiga • Amigaを選択 • cp -R sys/amiga sys/x68k (当時x68kと書いてたかは覚えていない。 x68030かも?)
  9. 5.コンフィグ調整とビルドの確認 • まずカーネルのビルドの方法を調べるところから。 (Makefileがなかった) • config(8)を使ってMakefileを生成することが分かる。ツールは移植した。 • AmigaとX68030では当然メモリマップが異なる。デバイスも異なる。 • まず最初は、作られるカーネルのコンフィグから使えないデバイスを外す。

    • そしてカーネルのビルドが通るかを確認する。 • 当時は68030 25MHzでカーネルビルドにたしか数時間。 ◦ 寝る前に仕掛けたら朝出来上がってる。 ◦ あるいは、実行して 30分後くらいにコンパイルエラーで止まってる。
  10. 7.メモリマップの調整 • 68030は、コールドスタート時、仮想記憶はオフになっている。 • システムレジスタのあるビットを 1にすることで、仮想記憶が有効になる。 • 仮想記憶が有効になってもプログラムカウンタはそのままの値。 • つまり、仮想記憶を有効にする場合、ページテーブルを事前に組んでおいて、仮想記憶を有効にした後そ

    のままプログラムが動けるように配置する。 ◦ もっとも簡単なのは仮想アドレス =物理アドレスとする。 • その他、ビデオメモリの位置やデバイスのアドレス空間など調整する • AmigaとX68030とではメモリマップが異なるので、いろいろ書き換える。
  11. 8.デバイスドライバ(シリアルコンソール)の開発 • 少なくともコンソールが必要。シリアルドライバを作った。 ◦ チップはZ8530 SCC。既存ドライバがなかったので見様見真似で書いた 。 • NetBSDカーネル起動直後は割り込みを使わないので、割り込みは後回し。 •

    起動直後に出るバナーが表示されるまで相当の時間を要した。 ◦ シリアルドライバがおかしいのではなく前出のメモリマップ周りのバグ。 • ここでTLBとページテーブルと、機種非依存メモリ管理の pmapをかなり読んだ。
  12. 9.起動するまで動かす • NetBSDカーネルの起動バナーが初めて表示されたのはいつか記憶にない。 • rootファイルシステムがないので当然カーネルの吐くメッセージを見るだけ。 • no root filesystemだかそんなメッセージを出して止まるまで。 •

    起動しない頃には、カーネルのソースコード内に「シリアルに 1文字出力」を埋め込んでどこまで動いたか を観測していた。いわゆる printfデバッグの簡易版。
  13. 10.SCSIドライバなどの開発 • X68030の標準ストレージインタフェースは SCSI • 富士通製SCSIコントローラを内蔵していた • ドライバはないので作成した。 • 友人がつてでデータシートを入手してくれて非常に助かった

    • いきなりおかしなデータを書いて壊されるとつらいので、最初は read only • 並行してビデオコンソールドライバとキーボードドライバも作成した • 当時、デバイスのmajor, minorは手で採番していたので、採番した
  14. 11. ブートメディア構築 • 当時はramdiskからブートする仕組みがなかった (と思う) • 可搬ストレージ(MO)にブートメディアを構築することにする。 • amiga用に配布されているファイルシステムイメージを入手、 MOに書き込む。

    ◦ 当時のMO(光磁気ディスク)の容量は128MB。 • NetBSDカーネルのコンフィグでMOをrootとするよう書いてビルド。 • 起動。 • 失敗。superblockがおかしいなどと言われる。 • ソースコード修正、ビルド、メディア作成、テストの繰り返し。
  15. 12. init diedとの戦い • rootをようやくmountできた • その直後に動くのが/sbin/init • だがこいつがすぐ死ぬ。カーネルは init

    diedと言ったっきりだんまり。 • 仮想記憶周りの問題か、ファイルシステム周りの問題か。 • 覚えていないが、どうにか死ななくできた。しかしその先が動かない • なぜかと思ったらそういえば タイマー割り込み作ってないからコンテキストスイッチしない ことに今さら気づ く。作り込む。
  16. シングルユーザーブート! • (たしか)1993年9月、NetBSD/X68030が初めてシングルユーザーブートに成功。 • ここまで独りで作業。ネットには参考情報がなく、書籍とソースだけが頼りだった。 ◦ 4.3BSDの本、一般的UNIX内部構造の本、 X68000ハードウェア解説の本 • 移植したものを動かすまで、動いている

    NetBSDを見たことがなかった。 • SCSIドライバを書き込み可能にして、 NetBSD上でカーネルをセルフビルドして、 a.outのアラインメントが 想定と違っていて調整したりなど。 • ネットを通じた配布をするには容量が大きすぎたので、 MOメディアの郵送回覧などをやった。 • 動き出してからは、他のデバイスを開発する人や X11を動かす人などたくさんの皆様の協力が得られた。 • 1996年5月、NetBSD/x68kはオフィシャルのリポジトリにマージされた。
  17. 昔は移植って大変だったけど 現在 • クロスビルド環境はシェルスクリプト一発で作れる (NetBSDの場合) • 共通レイヤー(MI)と機種依存部分(MD)が分離されていて読み書きしやすい • ramdiskからブートできるのでテストしやすい •

    インターネットに情報がたくさん落ちている、参考ソースも落ちている 知らないところから始めても、スムーズに移植を進められる周辺環境が整っている! しかし最近の開発ボードではメーカー提供の Linuxがあらかじめ用意されていることが多い