- uvm32は、マイクロコントローラなどのリソース制約環境向けのミニマルな仮想マシンサンドボックスで、単一のCファイルで構成され、動的メモリ割り当てなしで動作
- RISC-Vエミュレータベースで、C・Zig・Rust・アセンブリで作成されたバイトコードアプリを実行し、非同期設計によりホスト停止を防止
- 3KB以下のフラッシュ、1KB以下のRAMで動作可能で、安全性を優先し、不正なコードでもホストをクラッシュさせない
- 多様なVMホストのサンプルと言語別サンプルアプリを提供し、組み込み・ゲーム・プラグインなどさまざまな環境に統合可能
- MITライセンスで公開されており、研究、製品、組み込みデバイスで自由に活用可能
uvm32 概要
- uvm32は依存関係のない軽量仮想マシンサンドボックスで、マイクロコントローラやリソース制約のあるデバイス向けに設計
- 単一Cファイル構成、C99標準ベース、非同期設計、動的メモリ不使用
- STM32L0(ARM Cortex-M0+)基準で3KBフラッシュ / 1KB RAM以下で動作
- RISC-Vエミュレータをベースとしており、管理インターフェースと効率的なコードビルドツールを含む
主な用途
- Lua、Duktape、MicroPythonなどの組み込みスクリプトエンジンの代替
- サンドボックス環境による信頼できないコードの隔離
- Rust、Zigなどのモダンなシステム言語で開発できるよう支援
- **「Write once, run anywhere」**の原則によりマルチプラットフォーム保守を最小化
主な特徴
- C、Zig、Rust、アセンブリで書かれたバイトコードのサンプルを同梱
- ノンブロッキング設計により異常なコードでもホストを停止させない
- ホストI/Oを前提としない、シンプルで一貫した実行モデル
- 安全な最小FFIを提供
- 小規模スクリプトから複雑なアプリケーションまで実行可能
- 安全性優先設計で、VM内部エラーがホストを損なわない
- 完全なCPUエミュレータベースだが、ハードウェアシミュレーション目的ではない
代替手段との比較
- 既存の組み込みスクリプトエンジンと比べて小さなメモリフットプリント
- C、Rust、Zigなど広く使われる言語をサポート
- 既存ソフトウェアとの統合が容易
- イベント駆動・ポーリング・マルチプロセッサなど多様なパラダイムをサポート
- 異常なVMコードに対する堅牢性を確保
- 一方で、直接FFI呼び出し、最大効率、簡単なスクリプティング体験、標準ライブラリ内蔵は目標としていない
ビルドと実行(Docker)
- Cコンパイラだけでビルド可能で、Docker環境を提供
make dockerbuild、make dockershellコマンドで環境を構築
- Dockerシェル内で
makeを実行後、
./hosts/host/host apps/helloworld/helloworld.binを実行可能
host -hコマンドで全オプションを確認可能
ライセンス
- MIT Licenseを適用
- 研究、製品、組み込みデバイスなどで自由に利用可能
3件のコメント
Hacker Newsのコメント
コードを見てみたが、本当にコンパクトな構造だった
直接コンパイルや実行はしていないが、RISC-Vの32ビット整数・乗算・アトミック命令拡張を含んでいる
浮動小数点演算はエミュレータではなく、コンパイラ(gcc など)がソフトウェア関数でエミュレーションする
複数のコンパイラでサポートされる点は非常に賢い設計だと思う
実際の命令セットを実装したベースプロジェクトは mini-rv32ima である
このプロジェクトは、WASMのように共通実行環境を作ろうとする試みと似た領域にあるように見える
ただし、ベースがRISC-Vである点が異なる
それぞれのアプローチの制約や利点をもっと知りたいが、いずれにせよアプリケーションが共通VM上で動作する未来に向かっているようだ
現代のWebがその最も近い例だと思う
libriscvもクールで印象的なプロジェクトだ
ちなみに関連する議論へのリンクは こちら にある
ただし、RISC-Vはこの用途には向いていないかもしれない
たとえば即値のデコードをソフトウェアで処理すると遅いが、ハードウェアでは速い
それでもRISC-Vは安定していてシンプルに構成できるターゲットだ
コードが本当にきれいで、単一のCファイル構成が気に入った
サンプル実行のためにDockerを使う方式も、組み込み環境では非常に便利だ
テストカバレッジも良さそうで、メトリクスを見るのも興味深そうだ
医療機器にスクリプティング機能を追加する際、コアコードを毎回再検証しなくて済む利点がありそうだ
WASM Micro Runtime のような組み込み向けWASMインタープリタと比較すると興味深い
Cortex M4Fでは56.3Kとはるかに大きい
おそらくWASMが最小RISC-Vプロファイルより複雑な命令セットだからだろう
しかしWAMRは GC, JIT, WASI, スレッド, デバッガ対応 など、さまざまな拡張を含んでいる
「Just add rats」として ZigDoomの例 を紹介している
タイミングが絶妙だ
組み込みファームウェアテスト用の軽量エミュレータを探していたが、ほとんどの代替手段は重すぎるか不安定だった
メモリマップドIOのシミュレーションに対応すれば、実機なしでIoTやマイクロコントローラのドライバテストに役立ちそうだ
エミュレータコアはすでにメモリマップドIOをサポートしているが、uvm32ではそれをホスト側の追加RAMブロック(フレームバッファや別ヒープなど)として使っているだけだ
書き込みトラップは この部分、読み取りトラップは この部分 で処理できる
最後のフィッシング云々って、いったいどのコメントに出てきた話なのか分かりませんね
そのコメントはスパムとしてフラグされて消えてしまい、返信コメントだけが残って不自然になったようです。削除しておきます。