NetBSD/x68k 移植の思い出話
そうか、ちょうど30年前の1993年のいまごろだ。GWにX68030を買ってNetBSDの移植を始めたの。シングルユーザブートしたの9月なので移植には3〜4ヶ月くらいかかった計算。インターネットから情報を拾うなんてことができなかった時代に、一人で移植。
2023-06-07 12:57:05画面とかキーボードのドライバ動くまではコンソールはシリアルで、でもシリアルドライバ動くまではどこまで動いたかLチカで確認。とかやってました。いつごろなにができてみたいな進捗の記録は残っていませんが、書籍とかになんか書いたっけ? 忘れました。。
2023-06-07 13:26:28最初は、ビルド環境を構築するところからでした。いまはELFだけど当時はa.outフォーマット。これを吐き出してくれないと話にならなかった。
2023-06-07 18:39:10X68030実機上で開発してたけど、Human68kで動くa.outを吐けるgccが必要で、クロスコンパイル設定でgccをビルドするところから。当時すでにHuman68kにGNU Makeが移植されてたりbashが移植されてたりしたのでそんなに難しくなかった記憶。
2023-06-07 18:52:13それとは別に、NetBSDカーネルのソースコードを眺めてるとどこにも Makefileがない。Makefile.i386とかsuffixついてるファイルはある。中を見るとGNU Makeとは書き方が違う。これなにー? っていうのをいまだと情報溢れてるから解説あると思うけど、首を傾げてた。
2023-06-07 18:54:28で、configコマンドを使って、GENERICとかの定義ファイルを指定するとMakefile.なんちゃらの内容と組み合わせてMakefileを生成してくれるというんで、configコマンドをHuman68kに移植。というかそのままコンパイル。したかった。
2023-06-07 18:57:44MakefileはGNU Makeでビルドできないんで、BSD makeを移植。というかコンパイル。こちらはバッチファイルみたいのが用意されてたのでどうにかなった。
2023-06-07 18:59:24ビルド環境は整ったと思いたい。じゃあどこからどうやって移植しようか、と。たしか最初に公開されたNetBSD 0.8のサポートされるアーキテクチャは i386 hp300 amiga だったと記憶してますが、おお、Amigaじゃん!こいつにしよう、と選んだ記憶が。
2023-06-07 19:02:42hp300とamigaはともにモトローラ680x0だったので、機種依存じゃないCPU specificなコードはまるっと持ってこれると踏んだのでした。
2023-06-07 19:05:47移植はともかくa.outなカーネルのバイナリが作れないと話にならない、ということで、cp -R amiga x68030とかやって何も変更せずにconfig, makeからはじめました。(ほんとの最初はx68kじゃなくx68030でやってました)
2023-06-07 19:08:27ファイル名はTwentyOne サフィックスなし実行ファイル(+シェルスクリプト)はexecd シンボリックリンクはlndrv このへんのツールがあったのとUNIX like tools各種のおかげで、ビルド環境の構築は思ってたより楽だったと思います。
2023-06-07 19:11:56移植どこから手を付けるか。まず考えなければいけないのは、メモリマップ。そもそもamigaどうしてんのよっていうのをソースコードから読み解いて。じゃあX68030だとどうするのがいいか。pmap.cだったかな。いじくった記憶があります。
2023-06-07 19:16:54すんなり動くと嬉しいなあ、と思いつつ、コンソール入出力のコードを用意した記憶。Z8530だったかな、当時はどこにも公開コードがなかったので一から書き起こしたと思う。割り込みはまだ未対応。
2023-06-07 19:20:02で、メモリに置いてシリアルでコンソールさ割れるくらいのカーネルバイナリがビルドできた、と。じゃあこれどうやって起動するの? ほんとの最初どうしたかはあんまり覚えてない。たぶんいったんHuman68k上でメモリに読み込んで0番地にブロック転送してジャンプ、とかだったんじゃないかな。。
2023-06-07 19:23:25で、ですね。ホントの最初、うんともすんとも言わないわけです。シリアルも沈黙。なにが起こってんのかまったくわからない。 しかたないのでX68030本体にくっついてるLEDを光らせることに。メモリマップドI/Oなので、特定のアドレスに値を書き込めば光る。で、エントリポイント先頭に埋めて起動。
2023-06-07 19:27:12本当の最初はそれすら光らなくてジャンプ先を間違えてたとかやってたと思う。しばらく修正とテストを繰り返して、仮想記憶を有効にした瞬間にどこか彼方へ行ってしまってさようなら、というところまでたどり着く。C言語のmain関数にはまだたどり着いてない。
2023-06-07 19:29:59つまるところ、仮想記憶有効にしたときのメモリマップをうまく作れてないか、あるいは実行中の部分が物理アドレス=仮想アドレスにできてないか、とかそんな話。ここのデバッグにけっこう時間を費やした記憶があります。
2023-06-07 19:36:06なんかおかしいなあと思ったら、.textはちゃんとマップされてるけど.dataが変で、よく調べたらa.outの内容見て配置する部分(つまりカーネル以前)の問題だったりしたこともあった気がする。あと.bssをクリアし忘れてたとか。それ自分でやるんだーそりゃそうだー、みたいな。
2023-06-07 20:10:19で、仮想記憶オンで死ななくなって、ようやくmain()が呼べるところまでたどり着く。シリアルコンソールも一応文字が出せるようになって(cnput.c)、でも本来の起動時に出てくるはずのCopyrightはまだ出ない。各種初期化の途中? で詰まる。
2023-06-07 20:15:22ここからいくつかデバイスドライバ用意したような記憶。起動したらファイルシステムからinitを呼び出す必要があるので、まずはSCSIドライバから。X68000と同じ富士通のチップで、ハードウェア解説書にも一応情報あったけど、チップのドキュメントを提供いただいて非常に助かった記憶があります。
2023-06-07 20:19:08でも、ディスクふっとばされると死んじゃうので、最初はread onlyで。とかやった記憶。実際に読みに行く動作を検証するのはもっとだいぶ先でした。
2023-06-07 20:21:15シリアルコンソールもいい加減しんどいので、画面のドライバも作ることに。当時他のマシンは文字コードを特定のアドレスに書き込むと画面に文字が表示される仕組みが多く採用されてたけどX680x0はビットマップを書く。フォントイメージのROM領域からVRAMに転送する。
2023-06-07 20:25:18iteとかgrfとかあのへんの名前は元はamigaのコンソールドライバでつけられたのを大枠流用したので、名前もそのまま持ってきたって感じでした。
2023-06-07 20:30:41そうそう、起動うまくいかないときよーく調べたら、スタック領域ちゃんと作れてなかった(マップ忘れ)とか、スタックポインタが変なところ指してたとかいうのもありました。
2023-06-07 20:32:23どうにかこうにかして、Copyright表示てたのって夏だったかなー。よく覚えてない。ファイルシステムは、ホントの最初はamiga用に用意された構築済みファイルシステムイメージをそのまま使ってました。MOにベタっと書き込んで。でカーネル起動して出たメッセージは cannot mount root
2023-06-07 20:35:29