これまでの調査結果
2.11BSDのインストール時に使用されるテープ上のプログラムの一つにrestorがあります。
このプログラムは命令領域のサイズが大きいため、 separate I&D(SID)としてリンクされています。一方、サイズの小さいmkfsなどのプログラムは命令とデータは単一のアドレス空間で動作します。
SIDプログラムも単一アドレス空間のプログラムもファイル上は.text, .dataの順番に配置されていることに違いはないのですが、2.11BSDのbootプログラムは、SIDプログラムに限っては、.data, .textの順番にメモリに読み込みます。したがって、テープデバイスに対しては以下のような動作を行います。
- .dataセクションの先頭まで順方向にシークする
- .dataを読み込む
- .textセクションの先頭まで 逆方向にシークする
- .textを読み込む
TangConsoleDCJ11MEMの現時点の実装ではテープデバイスのファイル単位のシークは実装されていますが、レコード単位でのシークは対応していません。したがって、上記の1.や2.の「ファイルの途中までシークする」という操作はファイル単位のシークとして実行されます。
以上から、SIDプログラムを起動するためにはレコード単位のシークも実装する必要があることがわかりました。
テープデバイスのデータフォーマットの概略
前提知識としてテープデバイスのデータフォーマットについてごく簡単に書いておきます。
バイナリデータファイルは可変長のレコードに分割されて格納されます。一つのファイルは複数のレコードによって構成され、テープマークによってファイルの終わりが示されます。
テープデバイスはレコード単位やファイル単位で順方向/逆方向のシークが可能です。
TM11コントローラの機能
TM11のシーク関係のコマンドは、レコード単位の移動(Space forward, Space reverse)しかありません。よって、2BSDのドライバではファイル単位のシークを実現するためには以下のような工夫(?)をしています。
- ファイル単位のシークが要求されたらレコード単位のシークを実行する。この際、レコード数のパラメータとして極端に大きな値を設定する。
- TM11は指定された方向にシークを開始し、テープマークを検出することでシークを終了する。結果的にファイル単位でシークできる。
この方法はあくまでも2BSDに合わせた実装なので、マジックナンバーで見分けられない場合には意図した通りには動作しません。汎用性を持たせようとするとSIMHのテープイメージフォーマットのように、レコード長やテープマークの情報を付加するような方式が必要です。
現在の状況
以上の調査結果を元にTM11のエミュレーション部を変更してレコード単位のシークが動作するようになったと思ったのですが、メモリダンプを調べるとSIDプログラムが正しく読み込まれていませんでした。この問題について調査中です。
0 件のコメント:
コメントを投稿