2026-03-22

mbootとUnix-v6-Ken-Wellsch.tap

SETTING UP UNIX - Sixth Edition」の「Making a Disk From Tape」で行われた処理について調べています。ここで書かれている手順の概略は次の通りです。

  1. PDP-11のフロントパネルを操作し、100000番地からTU10コードを入力し、実行する。
  2. テープから先頭ブロックが0番地に読み込まれるので、実行する。これは「mboot」です。
  3. 「mboot」の中でプロンプト「=」が出力されるので、テープの内容をディスクに書き込むプログラム名を指定する。ドキュメントでは「tmrk」が指定されています。「mboot」は、指定されたプログラム「tmrk」をテープから探し、メモリにロードし、制御を移します。
  4. 「tmrk」が実行されると、指定位置から指定長をテープから読み込み、ディスクに書き出します。

 

UNIXv6が出た当時は、これらの手順を実機PDP-11/40などでおこなったのでしょうけれども、21世紀に生きる我々はSIMHのPDP11エミュレータを使います。そしてテープイメージには、ファイル「Unix-v6-Ken-Wellsch.tap」を使います。

 

「mboot」は、スクリプト「run」によると、「tpboot.s」、「tty.s」、「tm.s」からできています。これらのソースを参照し、SIMHのPDP11エミュレータのデバッグ機能を駆使し、時々Geminiとの対話を繰り返しながら、解析しました。なんとか「mboot」の動作は理解できた気がします。動作の概略は、以下のようになっています。

  1. TU10コードにより、「mboot」はメモリ番地0からロードされます。「mboot」の目的は、ユーザが指定した「tmrk」などのプログラムをメモリ番地0からロードして制御を渡すことなので、このままではよくありません。そこで自分自身を上位に移し、プログラムがロードされる場所を空けておきます。上位のメモリ番地は137000のようです。
  2. プロンプト「=」を出力し、ユーザからプログラム名を入力してもらい、それをテープから検索します。
    1. プログラムを入力する際、「@」が入力されると、それまでの入力が全て取り消されます。また「#」が入力されると、その直前の入力が取り消されます。
    2. 入力された文字列(「tmrk」など)がテープに存在するか検索します。テープファイル「Unix-v6-Ken-Wellsch.tap」を調べたところ、先頭ブロックには「mboot」が格納されていますが、その次には「hboot」が入っていることがわかりました。その次からTP(V)形式のディレクトリが続きます。PDP11のデバッグ機能を使って動作を確認すると、「hboot」が格納されているブロックから検索を始めていることが分かりました。TP(V)形式のディレクトリではないし、そもそも何故「hboot」がテープに置かれているのか分かりません。 
  3. テープ上の場所が分かったら、それをメモリ番地0からロードして、制御を渡します。ただしロードする前に、メモリを全て0クリアしています。未初期化の変数を参照してしまった場合、再現不能なバグが出ないための事前準備でしょうか。

 

テープファイル「Unix-v6-Ken-Wellsch.tap」を解析すると、次のようになっていました。

  1. Block#0は、a.out形式の「mboot」が格納されている。
  2. Block#1は、a.out形式の「hboot」が格納されている。
  3. Block#2からは、TP(V)形式のディレクトリ情報が格納されている。格納されているプログラムは、次の通りです。
    1. 「dldr」(size:000000344,tape:000031)
    2. 「dtf」(size:000004546,tape:000032)
    3. 「hboot」(size:000000724,tape:000037)
    4. 「hpuboot」(size:000000766,tape:000040)
    5. 「hthp」(size:000000624,tape:000041)
    6. 「htrk」(size:000000554,tape:000042)
    7. 「htrp」(size:000000566,tape:000043)
    8. 「mboot」(size:000000674,tape:000044)
    9. 「mcopy」(size:000000660,tape:000045)
    10. 「mem」(size:000012756,tape:000046)
    11. 「reset」(size:000000024,tape:000061)
    12. 「rkf」(size:000000200,tape:000062)
    13. 「rkuboot」(size:000000716,tape:000063)
    14. 「rpuboot」(size:000000730,tape:000064)
    15. 「tboot」(size:000000626,tape:000065)
    16. 「tcf」(size:000004516,tape:000066)
    17. 「tmhp」(size:000000574,tape:000073)
    18. 「tmrk」(size:000000524,tape:000074)
    19. 「tmrp」(size:000000536,tape:000075)
    20. 「uboot」(size:000001000,tape:000076)

0 件のコメント:

コメントを投稿