PDP-11インタプリタでUNIX V6のカーネルをビルドするまで

PDP-11のクロスコンパイラがビルドできたことをきっかけに、逆アセンブラを作り始めて、インタプリタでカーネルをビルドできるようになる過程です。 当初はブラウザで動かすためSilverlightで開発していましたが、最後にC++で書き直してコマンドラインアプリとしました。
6
七誌 @7shi

add r1,-(r2)みたいな命令を実行するとき、dstのsetとgetで2回デクリメントしていたのが敗因だった。

2011-04-08 16:39:04
七誌 @7shi

オペランドの処理を修正して、as2が動いた!だけどこのままだと激しく使いにくいので、箱庭から出さないと・・・

2011-04-08 16:57:54
七誌 @7shi

PDP-11インタプリタでV6のldも動いた。ccの前にstripを試そう。 http://7shi.net/v6/

2011-04-08 19:48:17
七誌 @7shi

ldがあればstripがなくても問題ないみたいなので、いよいよ本丸のccを攻める。依存するコマンドが色々ある: /bin/as, /bin/ld, /lib/c0, /lib/c1, /lib/c2

2011-04-08 21:28:07
七誌 @7shi

forkを処理せず子プロセスのふりをして、execで親プロセスにロールバックするという小細工で、ccから他のプロセスを呼び出す過程を調べた。とりあえずc0とc1に渡す引数が知りたかったので。

2011-04-09 00:05:46
七誌 @7shi

c0は動いたけどc1が動かない。movbの挙動が怪しい・・・

2011-04-09 01:01:27
七誌 @7shi

オペランドのインデント・デクリメントで、SPは常に2バイト単位だった。movb r0, -(sp) でspを-1していたからスタックがめちゃくちゃになっていた。ここを直したらc1も動くようになった。残るはc2。

2011-04-09 02:29:39
七誌 @7shi

c2は何事もなく動いた。あとはfork+execを細工すればccから一気にa.outが出せるはず。

2011-04-09 02:43:31
七誌 @7shi

やったー、ついにインタプリタ上でccが動いた! http://7shi.net/v6/ Silverlightの外に出すのは簡単なはず。これでようやくsimhの外でもバイナリをいじる道が開けた。ちょっと改造するにもedと格闘して大変だったのが、ようやく・・・

2011-04-09 03:15:48

C++で作り直し

七誌 @7shi

なんかforkがうまく動かないなーと思っていたら、@superhogeさんに教えてもらったpc+=2を忘れていた!

2011-04-09 23:26:27
七誌 @7shi

c0とc1は動くけどasが動かない。どこが間違っているのか・・・

2011-04-09 23:46:19
七誌 @7shi

execで飛んだ先の処理がおかしいみたいだ。

2011-04-10 00:07:15
七誌 @7shi

execでメモリを初期化しなかったためbssにゴミが残ったのが誤動作の原因だった。そういえばexecでメモリを操作するところは前回Lions本勉強会で読んだ所だった。

2011-04-10 00:18:32
七誌 @7shi

simhの外の環境にV6のCCがキタ━━(゚∀゚)━━ !!!!! http://twitpic.com/4irwbi

2011-04-10 00:31:23
拡大
七誌 @7shi

一気にC++で書き直したからさすがに疲れた。 https://bitbucket.org/7shi/v6run コンビニで食事でも買って来よう・・・

2011-04-10 00:35:58
七誌 @7shi

simh遅いと思っていたけど、自作インタプリタはもっと遅かった・・・

2011-04-10 02:14:47
七誌 @7shi

カーネルをビルドしてみたけど、arがまともに動いていないらしく、きちんとリンクできなかった。残念・・・

2011-04-10 02:18:46
七誌 @7shi

lib1とlib2をオリジナルから持って来るとオリジナルと同じカーネルが作れるので、ccやasやldは正常で、asだけ問題があるようだ。さて・・・

2011-04-10 02:28:33
七誌 @7shi

あれ?自分でコンパイルしたarに差し替えたら、simh上のv6でもarがおかしくなった。実装ミスじゃないかも?

2011-04-10 02:59:33
七誌 @7shi

sys statでstat構造体を変換して渡したらarが動くようになった!

2011-04-10 09:10:10
七誌 @7shi

arは動いたけど、/usr/sys/lib1と/usr/sys/lib2にはソースにないオブジェクトが含まれているみたいで、存在するソースだけでゼロから作ってもundefでカーネルが作れなかった。コメントアウトされているsysfixが怪しい。

2011-04-10 09:26:47
七誌 @7shi

sysfixはPDP-11/45用にI/D分離をするためのもので関係ないようだ。

2011-04-10 09:30:36
七誌 @7shi

lib2に含まれるcat.oとvs.oとvt.oのソースが見当たらない。これだけ退避させておけば、それ以外はゼロからビルドしていると考えても良いかな。

2011-04-10 09:38:55
七誌 @7shi

いや、勘違いだった。全部ソースは揃っていた。何が足りないんだろう?

2011-04-10 09:45:01