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 します。

これで、パソコンの発熱が抑えられて、少しは涼しくなります。