unix/v6
近くに歯科医院が出来たので、ご祝儀で行ってきた。別に歯が痛くなって止むに止まれず という訳ではなく。歯のメンテナンスと言うか予防保守の為だ。
この医院は、医院のクラスターの中に出来たんだ。古参は、産科、皮膚科、小児科とかが 居て、今後は、泌尿器科の医院も仲間に入るとか。こういうのって、最近の流行なんです かね? 実家のある田舎でも、医院BUS(街道)が出来ていたな。
歯石を取ってもらったんだけど、一応レントゲンもしときましょと言う事で、レントゲン室へ。 防護チョッキを付けて立っていると、頭の周りをセンサーがぐるぐるぐる。はい、写れました。 診察室へ戻ると、もう画像が表示されてたよ。
今流行りのiPodかなと思ったら、違った。モニターだけがアームでつるされてた。 よく見ると、WindowsXPでしたよ。で、レントゲン写真だけど、普通は歯の並びがU字に なってるはずだけど、コンピュータ処理で一直線に並んでいた。自分の歯の生え方なんて 見るのは初めて。それにしても、歯並び悪いなあ。今度行く時は、USBメモリーを持参して 記念に画像を貰ってきたいぞ。肖像権ならぬ歯像権って認められるのだろうか?
画像には、患者の名前と撮影日時と撮影条件とおぼしき、70KV,10mA なんてのが見て取れた。 70KV,10mAって、700Wだよね。まさかと思って百科事典の X線の項 を調べてみたら、1%ぐらいしかX線にならないんだ。それでも7Wか。余り被爆はしたくないね。
unix 6th edition
今まで、minixしてたんだけど、古典もやっておいた方がいいよと薦めてくれる人が居た。 『Lions' Commentary on UNIX』が、それだ。unix 6th のソースコードを列挙し、それを 解説した本だ。神を暴くなんてって事で、地下に潜った存在だったけど、Lionsさんの 努力により、正式に出版されたのかな。幸いおいらの本棚にも陳列されてたので、夏休みの 課題にしてみる。
資料は、2238クラブ が、よくまとまっている。また、 http://www.tuhs.org/wiki/The_Unix_Heritage_Society から辿れる http://minnie.tuhs.org/cgi-bin/utree.pl が、ソース漁りには最適かな。
pdp-11
で、v6は、pdp11で動いていたって事なんで、どんなCPUかちょいと調べてみる。 今は亡き、ミニコンの雄 DECの資料が公開されていた。 http://pdos.csail.mit.edu/6.828/2005/readings/pdp11-40.pdf
Lions本の解説では、pdp-11/45で動いていたらしいんだけど、pdp-11/40に固定/浮動小数点演算機構と 仮想記憶のオプションを付けた物が、pdp-11/45らしいんで、上記資料でいいだろう。
有名なCPUなので、保守マニュアルまで公開されてて、しばし読み漁ってしまった。あの頃の CPUは、TTLを組み合わせて作っていたんだねぇ。SN74181 とか、懐かしいぞ。
pdp-11のシュミレータ
有名なのはいいことだ。ちゃんとシュミレータが公開されてる。MACのやつだと、公開はされてる けど、toolboxが格納されてるROMからコードを引っこ抜いてこないと動かないという面倒 (と言うか、MACオーナー限定)があったりする。 pdpは、オープンハードウェアです。
ports/emulators/simh から簡単に入る。pdp11だけじゃなくて、大判振る舞い。
SIMH implements simulators for: - Data General Nova, Eclipse - Digital Equipment Corporation PDP-1, PDP-4, PDP-7, PDP-8, PDP-9, PDP-10, PDP-11, PDP-15, VAX - GRI Corporation GRI-909 - IBM 1401, 1620, 1130, System 3 - Interdata (Perkin-Elmer) 16b and 32b systems - Hewlett-Packard 2116, 2100, 21MX - Honeywell H316/H516 - MITS Altair 8800, with both 8080 and Z80 - Royal-Mcbee LGP-30, LGP-21 - Scientific Data Systems SDS 940 These simulators are capable of running the Unix V5, V6 and V7 binaries licenced for non-commercial use by SCO. See ${WRKDIR}/simh_doc.txt for further details. WWW: http://simh.trailing-edge.com
そして、肝心の unixが入ったDiskだけど、 Software Kits から、
PDP-11 UNIX V6 with sources (under license provided by Caldera Corporation).
を頂いてくれば良い。uv6swre.zip を展開し、出来たファイルをシュミレータに認識させる 為のスクリプトを用意してあげる。
[sakae@cdr ~/UV6]$ cat uv6 set cpu 11/45 att rk0 unix0_v6_rk.dsk att rk1 unix1_v6_rk.dsk att rk2 unix2_v6_rk.dsk att rk3 unix3_v6_rk.dsk boot rk0
これで準備完了。
ご対面
いよいよ起動して、1975年にスリップする。
[sakae@cdr ~/UV6]$ pdp11 uv6 PDP-11 simulator V3.8-1 Disabling XQ @unix login: root # ps awxl TTY F S UID PID PRI ADDR SZ WCHAN COMMAND ?: 3 S 0 0-100 1171 2 5172 ???? ?: 1 W 0 1 40 1266 6 5234 /etc/init 8: 1 W 0 71 40 1434 19 5262 - 8: 1 R 0 72 100 1761 17 ps awxl ?: 1 W 0 5 90 1674 5 4676 /etc/update # df /dev/rk2 1811 /dev/rp0 cannot open /dev/rp0 # ls -l total 234 drwxr-xr-x 2 bin 1040 Jan 1 1970 bin drwxr-xr-x 2 bin 352 Jan 1 1970 dev drwxr-xr-x 2 bin 304 Aug 20 12:57 etc drwxr-xr-x 2 bin 336 Jan 1 1970 lib drwxr-xr-x 17 bin 272 Jan 1 1970 mnt drwxr-xr-x 2 bin 32 Jan 1 1970 mnt2 -rw-rw-rw- 1 root 28472 Aug 20 12:01 rkunix -rwxr-xr-x 1 bin 28636 Aug 20 11:38 rkunix.40 drwxrwxrwx 2 bin 144 Aug 20 12:57 tmp -rwxr-xr-x 1 bin 28472 Aug 20 12:01 unix drwxr-xr-x 13 bin 224 Aug 20 12:22 usr drwxr-xr-x 2 bin 32 Jan 1 1970 usr2 # sync; sync; sync # Ctrl-e Simulation stopped, PC: 021630 (MOV (SP)+,177776) sim> quit Goodbye
@の所で、unixと入力し、プロンプトが出たらrootでlogin。終了は、haltもshutdownも用意 されてないので、syncの後、CTRL-e(で、シュミレーターを抜け)てから、quit。 プロセスがほんの少ししか動いていないですね。起動途中で、Disabling XQ って出てるけど、 資料によるとイーサネットカードなんですね。この頃のunixは、まだまだTCP/IP何? って 頃ですから、無用の長物です。
そんじゃ、少し遊んでみます。
# cat /etc/passwd root::0:3::/: daemon::1:1::/: bin::3:3::/bin: ken::6:1::/usr/ken: lvd::10:1::/usr2/lvd: # cd /usr/ken cd: not found # chdir /usr/ken # ls -l total 0 # chdir / # find / -print > CATLOG
kenって、あのkenさんですか。出荷するテープには、kenさんのアカウントや、kenさん専用の 裏口が用意されてたそうですけど、本当かなあ? kenさんの所に行ってみようとしたけど、 cdコマンドじゃなくて、chdirコマンドなんだ。どんな内容物が入っているか、とりあえず カタログを取ってみました。若し、shのソースが入っていたら、chdir改めcdにしちゃいましょう。
# grep sh CATLOG /bin/sh /usr/source/iolib/cflush.c /usr/source/s2/sh.c /usr/source/tmg/tmgb/push.s /usr/source/tmg/tmgb/shift.s /mnt/man/man1/sh.1 /mnt/man/man1/shift.1 /mnt/man/man8/crash.8 # chdir /usr/source/s2 # vi sh.c vi: not found
幸いな事に sh.cが入っていました。編集しようとしたら、viが入っていません。まだ、Bill Joy さんが出現してませんから、viが出来てないんだ。しゃーない、edを使う鹿。
# ed sh.c 11594 1 # g/chdir/p if(equal(cp1, "chdir")) { if(chdir(t[DCOM+1]) < 0) err("chdir: bad directory"); err("chdir: arg count"); 1 # /chdir/p if(equal(cp1, "chdir")) { s/chdir/cd/ p if(equal(cp1, "cd")) { w 11591 q
exを使える人はedも使えます。ファイルを読み込むと、編集ポインタは最後に位置します。 1で、1行目にポインタを戻し、chdirを探してみました。編集箇所が判明したので、もう一回 chdirを探して、それをcdに書き換え、確認してから、ファイルに書き出し、終了。 (エラーメッセージの書き換えは、取り合えず省略してます)
# cc sh.c # ls -l a.out -rwxrwxrwx 1 root 8804 Aug 20 13:13 a.out # strip a.out # chmod 755 a.out # ls -l a.out -rwxr-xr-x 1 root 6008 Aug 20 13:14 a.out # rm /bin/sh /bin/sh: 110755 mode y # cp a.out /bin/sh
コンパイルして、ストリップして、それを /bin/shに置き換えちゃいました。失敗したって オリジナルから直ぐに戻せますから、気楽なもんです。(って、/etc/passwdを見た時、shellを 指定する位置に、何も無かったような。。。)
# exit # quit quit: not found # Ctrl-d login: ken % pwd /usr/ken % cd /usr/source %
logoutは、exitでもquitでもなくて、CTRL-d なんですねぇ。今度は、健さんで入ってみました。 ちゃんと、cdが実現されました。パチパチパチ。そんじゃ、KとRに敬意を表して、helloworld してみます。
% banner helloworld X X XXXXXX X X XXXX X X XXXX XXXXX X XXXXX X X X X X X X X X X X X X X X X XXXXXX XXXXX X X X X X X X X X X X X X X X X X X X X X XX X X X XXXXX X X X X X X X X X X XX XX X X X X X X X X X XXXXXX XXXXXX XXXXXX XXXX X X XXXX X X XXXXXX XXXXX
落第ですか。そうですか。落第っ子は、BASICに夢中でしたね。
% bas 100 w = 65 200 h = 1.7 300 b = w / h / h 400 print b run 22.49134948
私のBMIは理想的? でも、今は夏太りで w = 67 ぐらいかなあ。体重測るの怖い。
% cd /usr/source/s2 % cat run : cc -s -O who.c cmp a.out /bin/who cp a.out /bin/who as write.s ld -s a.out -l cmp a.out /bin/write cp a.out /bin/write rm a.out
sourceの各dirの中にrun なんて言うファイルが有ったので、何物かと思って調べてみました。 どうやら、昔風のMakefileのようですね。
# cc -s who.c # cmp a.out /bin/who a.out /bin/who differ: char 2, line 1 # cc -s -O who.c # cmp a.out /bin/who
と思ったら、何となくロジックが逆のような気がするぞ。何か勘違いしてるかなあ? んでもって、下記は、runの親玉、buildworldだな。
% cat /usr/source/run chdir /usr/sys; pwd; time sh run chdir /usr/source/as; pwd; time sh run chdir /usr/source/c; pwd; time sh run chdir /usr/source/cref; pwd; time sh run chdir /usr/source/fort; pwd; time sh run chdir /usr/source/iolib; pwd; time sh run chdir /usr/source/m6; pwd; time sh run chdir /usr/source/mdec; pwd; time sh run chdir /usr/source/rat; pwd; time sh run chdir /usr/source/s1; pwd; time sh run chdir /usr/source/s2; pwd; time sh run chdir /usr/source/s3; pwd; time sh run chdir /usr/source/s4; pwd; time sh run chdir /usr/source/s5; pwd; time sh run chdir /usr/source/s7; pwd; time sh run chdir /usr/source/salloc; pwd; time sh run chdir /usr/source/sno; pwd; time sh run chdir /usr/source/tmg; pwd; time sh run chdir /usr/source/yacc; pwd; time sh run
残念ながら、/usr/sysは用意されてないけど、当時の事情が分かって面白いな。
# cat /usr/source/s4/hmul.s .globl _hmul _hmul: mov 2(sp),r0 mul 4(sp),r0 rts pc
pdp11の簡単なアセンブラです。 きっとこれライブラリーの一部なんだろうな。hmul(x, y)とかかな。 hmulって事は? そっか、16bit同士の掛け算をすると、結果は、32bitになる。そのうちの 上位16bitを返すから、hmulか。lmulの需要は無いのだろうか?探したけど無かったぞ。
引数に詰まれたxをr0に取り出し、それと引数のyを乗算する。結果はr0に残って返り 値になる。 (lmulが欲しいなら、mulした後で、mov r1,r0だな)
そして、帰り番地をpcにロードする。 pcと言ってもr7の事だけど。すっきりしたCPU だなあ。インテルも真似すれば、みんな苦労する事無かったのに。モトローラは68000を 作る時、pdp11をお手本にしたとか。そして、ルネサスのH8は68000のデザインを頂いた。
pdp11は、アセンブラで、オートインクリメントとかデクリメントとか持っている。c言語にも、 あるよね。i++ とか i-- が。アセンブラで一命令になります。よって、Cは、pdp11の 高級アセンブラーなんです。実感出来るな。
globalで快適に
さてさて、本を読んでみようと思ったんだけど、ソースコードと解説が、本の前後に 分かれているので、ちと参照しずらい。ソースは、Webで見てねと、用意されている。 Lions互換ソースコード。ありがたい 事です。
でも、ちょっとあの定義何だったかなとなると、目grepしたりで、面倒だ。そんな訳で globalしとく。上記からソースを頂いて、ちょっと加工し、元ソースに戻した。(折角用意 していただいたのにごめんなさい)
#!/bin/sh mkdir sys for h in *.html do f=`echo $h | sed -e 's/.html//'` w3m -dump $h | sed -e 's/....://' > sys/$f done
後は、cd sys; gtags; htagsで快適。
快適ついでに書いておくと、pdp11のシュミレータを動かしたままにするのは止しましょう。 シュミレータは、unix/v6のアイドルルーチンも全速力でシュミレートするので、パソコンは 休む暇もなくて発熱します。使わない時は、シュミレータをCtrl-eで休止状態にしておきましょう。 再開は、sim> のプロンプトの所で、cont します。
これで、パソコンの発熱が抑えられて、少しは涼しくなります。