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

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

ディスクイメージから引っ張って来たlib1を使うとカーネルのリンクに成功する。lib2は自分でビルドしたのでOKだった。

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

simh上でやっても同じ結果になったので、インタプリタのバグによる誤動作ではなく、コマンド自体の挙動は同じようだ。

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

あれ、ひょっとしてアーカイブに入っている順番が重要?

2011-04-10 10:05:14
七誌 @7shi

どうやらarの中に並んでいる順番が重要らしい。オリジナルと同じ順番で並べたらリンクが通った。これでカーネル全部を自力でビルドできた!

2011-04-10 10:13:08
七誌 @7shi

lib1の中でmain.o trap.o sig.o sysent.oを先に並べないとリンクできないことが分かった。リンカの構造をちゃんと理解していないのでよく分からないけど、そろそろ時間切れ。準備をして会場に向かわないと。

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

デモのアプリをNetBSDでテストしてみよう。

2011-04-10 20:12:37
七誌 @7shi

echoがシェルによって方言がある。echo "abc\ndef"を受け付ける環境もあれば、echo -e "abc\ndef"としないといけない環境もある。前者で-eを受け付けないこともあるのが問題。結局(echo "abc";echo "def")みたいに書くしかなさそう。

2011-04-10 21:07:55
七誌 @7shi

NetBSDで自作インタプリタを動かしたら、VMware上(ハードウェア支援なし)なのにホスト側のInterixで動かすより5倍くらい速かった(76秒→16秒)。コンパイラなんてオーバーヘッドが気になるほどシステムコールを呼ぶとは思えないんだけど、遅すぎ。

2011-04-10 21:18:31
七誌 @7shi

正直、あまりにも遅いのでどうしようかと思っていたけど、Interix特有の問題なら無視しよう。

2011-04-10 21:22:01
七誌 @7shi

あれ、カーネルがビルドできていたと思っていたけど、よく見るとリンク時にエラーが出ている。どこか間違えたかな・・・

2011-04-10 21:34:37
七誌 @7shi

#readLions 今日デモ中に@oracchaさんからご指摘のあった1文字ずつsys writeしていることとか、dupでキャッシュする裏技とか、該当箇所をアセンブリソースからぱっと見つけられず、説明がぐだぐだになった。こういうのはコメンタリーとしてまとめるべきと感じた。

2011-04-10 21:42:25
七誌 @7shi

インタプリタを作るときにひたすらユーザー側の動きを追ったけど、ユーザー側の処理はLions本にほとんど書かれていないから、気付いたことはメモでも何でも残しておくべきと思った。自分の中でも整理していないからうまく説明できないし、すぐ忘れてしまう。

2011-04-10 21:56:55
七誌 @7shi

そういえば今日、forkとexecをインタプリタで実装する際に、asとccのパターンに特化して小細工で再現した話をした。やばい、もう忘れていた・・・ ( #debhw live at http://ustre.am/mjex)

2011-04-10 22:04:24
七誌 @7shi

syncの話を聞いて、9801のDOSで[STOP]キーを何度か押してキャッシュを吐かせてから電源を切っていたのを思い出した。 ( #debhw live at http://ustre.am/mjex)

2011-04-10 22:47:48
七誌 @7shi

V6でもユーザーランドのアセンブリではsys signalと書いてありました。 ( #debhw live at http://ustre.am/mjex)

2011-04-10 22:49:51
七誌 @7shi

インタプリタをご紹介いただきありがとうございます。 ( #debhw live at http://ustre.am/mjex)

2011-04-10 22:54:25
七誌 @7shi

波に乗っている感じがするのでこのままV6V7で突っ走りたい気持ちは山々だけど、PE勉強会の資料がまったくできていないので無理・・・

2011-04-10 23:03:29
七誌 @7shi

C++版を正式公開して区切りを付けようと思っていたけど、なぜかカーネルがうまくコンパイルできなくなっている。あれー、何か見落としているのかな・・・

2011-04-10 23:21:42
七誌 @7shi

V6インタプリタを作った動機のうち、バックスペースできないのと、simhの外に出したいというのは、単に私が解決策を知らないだけだった。最後に残ったのは見やすい逆アセンブラが欲しいというものだけ。.sと逆アセンブルとを見比べないと、どうにもイメージが湧かない。

2011-04-10 23:27:38
七誌 @7shi

あ、そうだ。シンプルなコンパイラとpre K&Rの文法に興味があったので、カーネルのビルドとは関係なく純粋に処理系として触ってみたいという動機もあった。結果的にこれは既存シミュレータで解決可能だったけど。

2011-04-10 23:35:52
七誌 @7shi

あーーー、入れ忘れのnmを追加しようとして、間違えてldを上書きしていた!どうりで朝はできていたビルドができなくなっているわけだ。しょぼい理由でがっくり・・・

2011-04-11 00:02:15
七誌 @7shi

NetBSD上でも自作インタプリタでV6カーネルがビルドできた。17秒。Interixが遅過ぎたので速く感じたけど、実際はsimhと同じくらいの速度だった。最適化の工夫を何もしないでこれくらいのスピードが出れば充分かな。

2011-04-11 00:18:47
七誌 @7shi

FreeBSDでも試してみた。15秒。少し速い。

2011-04-11 00:34:34
七誌 @7shi

とりあえずInterixとNetBSDとFreeBSDで動くことは確認したので、タグを付けることにしよう。

2011-04-11 00:43:25
七誌 @7shi

メモ:fork+execをsetjump+longjumpもどきで誤魔化したことについてまとめる

2011-04-11 00:47:47
前へ 1 ・・ 3 4 次へ