当プロジェクトは,x8086アーキテクチャ対応MINIX2のユーザランドで実行可能なバイナリファイル の実行をエミュレーションするプログラムである.当プログラムには以下の3種類の実行モードがある.
- デフォルト;通常の実行モード
- ディスアセンブル;バイナリファイルのテキスト情報をディスアセンブルした結果を表示する
- VM;バイナリファイルを実行し,命令ごとのレジスタ・メモリの状況を表示する
- OS: Ubuntu 22.04.4 LTS
- CPU: intel x86_64 13th Gen Intel(R) Core(TM) i7-13700K
- ツールチェイン: cargo 1.76.0 (c84b36747 2024-01-18)
- コンパイラ: rustc 1.76.0 (07dca489a 2024-02-04)
- コンパイル対象:x86_64-unknown-linux-gnu
- ディスアセンブル及びVMモードのフォーマットは既存VMと同一である.既存VMの出力と差分を確認することによってプログラムを検証する.
- ルートディレクトリの
a.outはnmの実行に必要であるため残しておく
./src
├── arch
│ ├── asm.rs ... 命令セットに関する構造体及び関数を定義している
│ ├── bin.rs ... バイナリファイルに関する構造体及び関数を提供している
│ ├── constant.rs ... 定数の情報が格納されている
│ ├── decode.rs ... テキスト情報の解析に関する機能が含まれている
│ ├── header.rs ... ファイルヘッダの定義及び処理を行う構造体や関数が含まれている
│ ├── mod.rs ... モジュールのルートファイルで、他のファイルをまとめて管理している
│ ├── opcode.rs ... オペコード(命令コード)に関する構造体や関数が含まれている
│ ├── operand.rs ... オペランド(命令の対象)に関する情報が含まれている
│ ├── reg.rs ... レジスタに関する構造体及び関数が含まれている
│ └── vm.rs ... 仮想マシンに関する機能を提供している
├── main.rs ... プログラムのエントリポイント
└── test
└── mod.rs ... テスト用のモジュールファイルで、テストコードが含まれている
※cargo run は -- のあとにバイナリファイルに渡すオプションを指定する.(ビルドも同時に行う)
cargo run -- <file>
cargo run -- -m <file>
cargo run -- -d <file>
- なお,releaseモードでビルドした実行ファイル
minix_vmもルートディレクトリに用意しており,上記と同様のオプションで実行可能である
- すべてのモードのテストケースを用意
./bin/にminix2_setuptool/tests/の1.c~7.cに対応する実行ファイル1c~7cと,nmが格納されている../origin/default,./origin/dasm,./origin/vmにそれぞれ既存VMのデフォルト,ディスアセンブル,VMモードの実行の出力結果が格納されており,テストコマンドによって当VMの出力と比較を行う.- 当VMの出力は
./out/default,./out/dasm,./out/vmに格納される
cargo test
cargo test default
cargo test dasm
cargo test vm
- 既存VMの出力との比較テストケースを最初に用意し,テスト駆動的に開発した
- オペコードの粒度をドキュメントに沿って細かくした.
- 例:
addをadd Immediate to Register/Memory,add Immediate to Accumulatorなどに分ける - 命令実行の統計情報を集積する等、VMならではの機能を追加する場面では有用であると判断してこの仕様にした.しかし,今回の用途では必要なかった
- 例: