SIMHのPDP11エミュレータを使ってUNIXv6を学ぼうと考えています。同様の志を持つ人たちが、ネットでも書籍でも多くの情報を提供しています。ただしUNIXがインストールされた環境を前提にしていることが多いように見受けられます。カーネルを学ぶには、インストールが済んだことを前提にする方が良いのだと思いますが、PDP-11について学ぶ練習のため、「SETTING UP UNIX - Sixth Edition」の手順でインストールするところから調べてみようと思います。
SIMHで利用できるテープイメージのファイルが「Unix-v6-Ken-Wellsch.tap」として入手できます。これはSIMHで扱える形式になっているようです。その構造は「SIMH Magtape Representation and Handling」という資料があります。この構造を確認するため、Pythonでスクリプトを組んでみました。
#!/usr/bin/python3
def readblock(f):
global TapeMark
global Block
Block += 1
len0 = int.from_bytes(f.read(4),'little')
if len0 == 0:
TapeMark += 1
if TapeMark >= 2: raise EOFError
return 0
TapeMark = 0
data = f.read(len0)
len1 = int.from_bytes(f.read(4),'little')
print("[%6d]:" % Block, TapeMark, len0, data[:4])
return 0 if len0 != len1 else len0
TapeMark = 0
Block = 0
with open("Unix-v6-Ken-Wellsch.tap","rb") as f:
while True:
try:
readblock(f)
except EOFError:
break
#[EOF]
これで確認すると、512バイトのブロックが12,100あります。ドキュメントに書かれているとおりです。
また先頭ブロックには「mboot」があります。次のブロックには「hboot」が置かれています。その後には「TP(V)」形式のディレクトリが続きます。ブートプログラムとして「mboot」と「hboot」の二つが用意されている理由はなんでしょうか。ドキュメントでは、フロントパネルから入力する「TU16」のプログラムが「(To be added)」となっています。このテープの配布を受けた側がTU10でもTU16でも対応できるようにしておいたのかもしれません。