一款用 Rust 編寫的 RISC-V 模擬器。它能啟動 Linux。

該機器實現了 RV64IMAFDC 指令集,支援 M/S/U 特權級別和 Sv39 虛擬記憶體。它在 ARM64 和 x86_64 主機上運行 JIT,並在需要時回退到直譯器模式。周邊設備包括 UART 16550、CLINT、PLIC 和 SBI 1.0。有一個外部依賴:zstd。

它並非最快的模擬器。在直譯器模式下,其速度約為 QEMU 的三倍慢。在 JIT 模式下,約為二十九倍慢。程式碼區塊鏈接尚未實施;這將有所幫助。我們坦白說明這一點,以便您了解您將獲得什麼。

它的優點:操作簡單,提供 HTTP API 控制機器,能夠執行裸機 ELF 而無需核心,並且可以儲存和恢復完整的機器狀態。這些對於系統工作和測試非常有用。

二進位檔位於 target/release/emuko。請建立一個別名。

下載 Debian RISC-V 網路開機核心和 initrd 到 ~/.emuko/。SHA256 已驗證。不需要您自己的核心。

模擬器作為守護進程運行。您將連接到其控制台。您將看到核心啟動。您將獲得一個 shell。

守護進程監聽 http://127.0.0.1:7788/v1/api/,並接受 WebSocket 控制台連線於 ws://127.0.0.1:7788/v1/ws/uart。兩者都可以從腳本使用。

有時您不需要作業系統。您只需要機器、一個二進位檔,以及它們之間沒有其他東西。

守護進程會重置機器,將 ELF 區段載入到其物理位址,並開始執行。輸出透過 UART 控制台傳送。守護進程必須已經在運行。

要從裸機寫入控制台:將一個位元組儲存到 0x1000_0000。

examples/ 目錄包含以這種方式運行的程式。

需要一個 RISC-V 交叉編譯器來建置它們。在 macOS 上:brew install riscv64-elf-gcc。在 Linux 上:apt install gcc-riscv64-linux-gnu。

機器狀態 — 暫存器、記憶體、一切 — 都可以儲存和恢復。

虛擬機器使用與 QEMU RISC-V virt 平台相容的固定 MMIO 配置。

使用預設設定(load_addr=0x80200000,1 GiB RAM):

DTB、initrd 和 EFI 放置在 RAM 頂部向下。模擬器會在啟動時檢查與核心的重疊,如果 RAM 太小則會停止並顯示清晰的錯誤。

ELF PT_LOAD 區段放置在其 p_vaddr 位址。bare_printf 在 0x8000_0000 連結:

沒有核心。沒有 initrd。沒有 DTB。暫存器從零開始,除了 sp,模擬器會將其設定為 ram_base + 0x100000,然後 start.S 接管。

選項可以透過命令列傳遞、設定為環境變數,或放在 emuko.yml 中。

與常用 RISC-V 模擬器的直接比較。✅ = 支援且已記錄。— = 未內建。

用 Rust 編寫的 RISC-V 模擬器,支援 JIT 在 ARM64/x86_64 和 Sv39 虛擬記憶體上啟動 Linux