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がある。まだこのころはアセンブリでカーネルが書かれていた。各ソースコードの概要はこんな感じ。
- u0.s: 初期化
- u1.s: システムエントリ、システムコール
- u2.s: 残りのシステムコール
- u3.s: プロセススイッチ、スワッピング
- u4.s: キャラクタデバイス割込みルーチン(DC-11以外)
- u5.s: ファイルシステム
- u6.s: ファイルシステム
- u7.s: ファイルシステム、キャラクタデバイス
- u8.s: ブロックデバイス(ディスク、テープ)
- u9.s: DC-11非同期通信インタフェース
- ux.s: システムテーブル(データ構造)の定義
catだってアセンブリで書かれている。V1カーネルの上で、初期のCコンパイラ(last1120c Cコンパイラ)を動かそうともしているようだ。試してみたところ、crt0.oが見つからないとかで動かなかったけど。
以下は動かしたときのメモ。Readmeに必要な手順がちゃんと書いてあるので、それにそっていけばOK。MacOS XでSIMHがコンパイルできなかったので*1、とりあえずVMWare FusionのUbuntu 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"でいいようだ。