UNIX 1st ed.カーネルのソースコード

以前、「よみがえるUNIX 1st ed.」というエントリを書いたが、そのソースコードが公開されていた(unix-jun72)。SIMHシミュレータを使って、当時のUNIX環境を再現することもできる。すばらしい!

まず、Subversionからコードをチェックアウトする。

$ svn co http://unix-jun72.googlecode.com/svn/trunk/ unix-jun72-read-only

pagesの下にOCRから取り込んだカーネルアセンブリコード(u0.s, ..., u9.s, ux.s)とinit、shがある。まだこのころはアセンブリカーネルが書かれていた。各ソースコードの概要はこんな感じ。

catだってアセンブリで書かれている。V1カーネルの上で、初期のCコンパイラ(last1120c Cコンパイラ)を動かそうともしているようだ。試してみたところ、crt0.oが見つからないとかで動かなかったけど。

以下は動かしたときのメモ。Readmeに必要な手順がちゃんと書いてあるので、それにそっていけばOK。MacOS XでSIMHがコンパイルできなかったので*1、とりあえずVMWare FusionUbuntu 9.04上で。

SIMHシミュレータをダウンロードする。v3.8-1が最新のようだ。zipファイルを展開して、トップディレクトリにBINディレクトリを生成し、makeする。引数なしでmakeするといろんなシミュレータが生成されるが、今回はPDP-11だけでOK。これをunix-jun72のtoolsディレクトリにコピーしておく。

$ mkdir BIN
$ OSTYPE=darwin make pdp11
$ cp BIN/pdp11 ../unix-jun72-read-only/tools

で、unix-jun72をmakeすると、なんかパッチでエラーになる。おそらくpatches/core/initorig.patchの2行目が間違っていて、init.sじゃなくてbuild/init.sに直しておく。

Patching...
  aout407
  ecore
  fastout
  initorig
missing header for unified diff at line 3 of patch
The text leading up to this was:
--------------------------
|--- init.clean	2008-06-25 08:39:57.000000000 -1000
|+++ init.s	2008-06-25 08:40:08.000000000 -1000
--------------------------
File to patch: ^Cmake[1]: *** Deleting file `u0.s'
make[1]: *** [u0.s] Interrupt
make: *** [all] Error 130

今度はうまくmakeできるはず。

simh.cfgが起動スクリプトになっている。

$ ./simh.cfg 

PDP-11 simulator V3.8-1
./simh.cfg> #!tools/pdp11
Unknown command
Disabling CR
Disabling XQ
RF: buffering file in memory
TC: creating new file
TC0: 16b format, buffering file in memory
Listening on port 5555 (socket 7)

:login: root
root
# ls -l
total    6
 43 sdrwr-  2 root    620 Jan  1 00:00:00 bin
 42 sdrwr-  2 root    250 Jan  1 00:00:00 dev
109 sdrwr-  2 root    110 Jan  1 00:00:00 etc
104 sdrwr-  2 root     50 Jan  1 00:00:00 tmp
 41 sdrwr-  9 root    100 Jan  1 00:00:00 usr
# 

おぉ、動いた! ちなみにcdはchdirで*2。V6 shのbuilt-inもchdirだけだったような気がするけど、いつからcdになったのだろう? bourne shellからかな。

psすらないなぁ。

シェルもリダイレクトはあるけど、パイプはない。コマンドのパースもなんかあやしくて、"ls >a"と書く必要がある(">"の前には必ず空白が必要で、後に空白を入れてはいけない)。"ls>a"は"No command"、"ls > a"は"Output file"というエラーになる。

man pageもあるらしいが、このディスクイメージには含まれていない。ちょっと残念。

Ctl-eでシミュレータの実行が止まり、モニタ?に戻る。

# 
Simulation stopped, PC: 007332 (MOV (SP)+,25244)
sim>   
sim> q
Goodbye
RF: writing buffer to file

あと、5555ポートからtelnetしてもログインできる。

ソースコードは時間が空いたら眺めてみよう。

(追記:2009-08-15)simhをMacOS Xコンパイルするには"OSTYPE=darwin make pdp11"でいいようだ。

*1:posix_rtが見つからないのでリンクエラー。どうにかできそうだけど、後で調べる。

*2:PDP-7のころはchというコマンド名だったとか。