2019年10月14日月曜日

XOUTフォーマット 1

XOUTはCP/M-8000で使われている、実行とリンクが可能なオブジェクトファイルの形式です。
解析しているうちに頭がこんがらがってきたので、ファイル構造をメモ代わりに書いていきます。
参考にした情報は、CP/M-8000 Programmer's Guide (注 PDF)と P-CP/M-Z8k SOURCES (注 ZIP) にあるLD8Kリンカのソースコードです。

説明中の変数名は、リンカのソースコードで使われている名前をそのまま使っています。
ちょっとわかりにくい命名ですが、コードを読むときの助けになるよう、そのままにしておきます。

Z8000はビッグエンディアンなのでデータは最上位バイトから最下位バイトへの並びです。
各データ構造は2 byte境界で揃えられています。

XOUTフォーマット  

a.outフォーマットと似た構造になっており、5つのパートからなっている。
  1. ヘッダ
  2. セグメント情報
  3. コード/データ 
  4. 再配置情報
  5. シンボルテーブル

ヘッダ 16 byte

ここには、セグメントの数や各パートのサイズなどのファイルの全体的な構造が書かれている。

 x_magic (2 byte) 
 
 ファイルの形式を認識するための番号
 
 0xEE00 セグメンテッド    実行不可      
 0xEE01 セグメンテッド    実行可能
 0xEE02 ノンセグメンテッド 実行不可 
 0xEE03 ノンセグメンテッド 実行可能  命令コードとデータの空間は非共有
 0xEE07 ノンセグメンテッド 実行可能  命令コードとデータの空間は共有
 0xEE0B ノンセグメンテッド 実行可能  命令コードとデータの空間を分離 

 リンク可能なのは0xEE00か0xEE02で、セグメンテッドとノンセグメンテッドはリンクできない。
 リンカのソースでは、リンク可能な0xEE06と0xEE0Aも存在していることになっている。
 配布されているCP/Mのイメージに含まれるコマンドは、0xEE03か0xEE0Bだけで、
 0xEE01, 0xEE07は見当たらない。

 0xEE03と0xEE07の違いは不明だが、64k byteの空間に命令コードとデータを収める形式。
 マジックが0xEE07のコマンドが無いため、比較ができないので不明。
 
 0xEE0Bは、コードとデータの空間を分離して、64k byteづつの空間をそれぞれに割り当てる。
 1セグメントが64k byte の制約を緩和できる。CPUに外付けのMMUがないと実現できない。


 x_nseg (2 byte) 
 
 セグメントの数
 
 x_init (4 byte) 
 
 コード/データのバイト数

 x_reloc (4 byte) 
 
 再配置情報のバイト数
 値が0の場合は、ファイルはリンクされている。

 x_symb (4 byte)
 
 シンボルテーブルのバイト数
 値が0の場合は、ファイルからシンボルテーブルは取り除かれている。

0 件のコメント:

コメントを投稿