2025/08/26 07:58 Emulating aarch64 in software using JIT compilation and Rust

ロボ子、新しいエミュレータのニュースを見つけたのじゃ! Manos PitsidianakisさんがRustで作ったJITコンパイルエミュレータ「simulans」について、話しても良いかのじゃ?

Rust製のJITコンパイルエミュレータですか、面白そうですね! ぜひ聞かせてください、博士。

このエミュレータは`aarch64` ISAを対象にしてるみたいじゃ。QEMUのTCG(Tiny Code Generator)の動作原理を理解するために作ったらしいぞ。

QEMUのTCGを理解するための演習ですか。素晴らしいですね。具体的には、どのようにエミュレーションを行うのでしょう?

`aarch64`バイナリコードを[binja](https://binary.ninja/2021/04/05/groundup-aarch64.html)で逆アセンブルして、各命令をCraneliftのJITバックエンドで変換するみたいじゃ。

なるほど、逆アセンブルしてJITコンパイルするんですね。QEMUはダイレクトブロックチェーニングによる最適化を実施するとありますが、simulansでも同様の最適化をしているんですか?

記事によると、変換ブロックは複数の命令をエミュレート可能で、QEMUと同じようにダイレクトブロックチェーニングによる最適化をしてるみたいじゃな。

最適化もされているんですね。デバイスとしてPL011(Arm UARTペリフェラル)を実装しているとのことですが、これはどういうことですか?

UARTのMMIO(メモリマップドI/O)を介して文字を出力できるようにしてるみたいじゃな。これによって、エミュレータ上で動くプログラムがテキストを出力できるってことじゃ。

なるほど、UARTを通じて出力できるんですね。GDBサーバを実装してリモートデバッグをサポートしているのも便利ですね。

GDB Remote Serial Protocolを使ってるみたいじゃな。デバッグが捗るぞ!

テストはどのように行っているんですか?

ユニットテストとベアメタルプログラムの実行でテストしてるみたいじゃ。ユニットテストは個々の命令の結果を検証して、ベアメタルプログラムはUARTへの文字列出力とデバイスツリーの解析をテストするみたいじゃな。QEMUとの並行実行とレジスタ状態の比較もしてるみたいじゃぞ。

QEMUとの比較も行うことで、エミュレータの精度を高めているんですね。今後の課題は何があるんでしょうか?

例外処理、タイマーサポート、MMU/仮想メモリ、割り込みコントローラ(GICv2)の実装が課題みたいじゃな。`rust-vmm`コンポーネントの組み込みや、Arm ISAのSAIL仕様を用いたコード生成またはテストケースの生成も検討してるみたいじゃ。

なるほど、今後の発展が楽しみですね。勉強になりました!

ところでロボ子、エミュレータの中で一番好きな命令は何じゃ? 私はやっぱりNOP(No Operation)かの。何もしないけど、それが良いのじゃ!

博士、それは命令じゃないです!
⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。