A new open‑source emulator written in Rust, emuko, can bring up a full Linux system on a RISC‑V virtual machine within minutes. Its design emphasizes speed, simplicity, and developer‑friendly controls, while offering features that rival larger commercial tools. The project’s creator, wkoszek, has released a detailed comparison with QEMU, Spike, and Renode, highlighting where emuko shines and where it still lags.
The rise of RISC‑V as an open instruction‑set architecture has created a demand for tools that let developers test software without waiting for silicon. Emulators that can start a Linux kernel quickly are valuable for CI pipelines, education, and early hardware verification. wkoszek’s emuko project, hosted on GitHub under the repository wkoszek/emuko, attempts to fill that gap with a pure‑Rust implementation that boots a Debian BusyBox image in a matter of seconds.
What emuko does
The emulator supports the RV64IMAFDC base ISA plus the M, S, and U privilege levels. It implements Sv39 virtual memory translation, which maps 39‑bit virtual addresses to a 48‑bit physical address space. Memory is allocated on the host and accessed through a JIT backend that translates RISC‑V instructions into native host code. The backend selection is adaptive: emuko first tries a JIT path for ARM64 or x86_64, falling back to an interpreter if the JIT fails. This design reduces latency for most workloads while keeping a safety net for edge cases.
A snapshot mechanism records the full machine state, including CPU registers, memory contents, and peripheral configurations. Snapshots can be taken manually with the snap command or automatically every N instructions. Restoring a snapshot returns the emulator to the exact point it was saved, which is useful for debugging or for resuming long‑running tests. The HTTP API exposed on port 7788 allows external scripts to start, pause, step, and restore machines without a terminal attached. A WebSocket endpoint provides a live UART console that can be injected with commands from a host program.
The emulator includes a differential checker that runs the same workload under both the JIT and interpreter paths and compares the resulting memory state. When the two diverge, the checker reports the instruction offset and the differing register values. This feature helps uncover subtle bugs in the translation layer and gives developers confidence that the JIT is faithful to the reference implementation.
Technical details
The JIT backend works by generating a small block of host code for each RISC‑V basic block. Each block contains a sequence of host instructions that perform the same arithmetic, logical, and control‑flow operations. Because Rust’s LLVM backend produces efficient machine code, the generated blocks are comparable in speed to QEMU’s TCG translator for short loops. The adaptive backend logic examines the host CPU’s capabilities at startup; if the host supports the required instruction set extensions, the JIT path is chosen. If not, the interpreter path, which executes each RISC‑V instruction in a loop, is used instead.
Virtual memory translation follows the Sv39 scheme. The emulator maintains a page table in host memory and updates it whenever a RISC‑V sfence.vma instruction is executed. The translation is performed on demand, caching recent page‑table walks to avoid repeated work. The snapshot routine walks the page‑table structures, copies the physical pages to a compressed archive using zstd, and stores the archive alongside a metadata file that records the CPU state. Restoration decompresses the archive, rebuilds the page tables, and reloads the saved registers.
UART 16550 emulation provides a serial console that forwards data to a host terminal. The emulator also implements the CLINT (Core Local Interruptor) and PLIC (Platform Level Interrupt Controller) devices required by the SBI specification. These peripherals are modeled as simple data structures that raise interrupts when the guest writes to the appropriate registers. The emulator does not yet model full PCIe or virtio devices, which limits its usefulness for complex board simulations.
Comparison with existing tools
The creator has compiled a feature matrix that places emuko alongside QEMU (RISC‑V virt), Spike, and Renode. The table shows which capabilities are built‑in and which are documented.
| Feature | emuko | QEMU (RISC‑V virt) | Spike (riscv‑isa‑sim) | Renode |
|---|---|---|---|---|
| JIT / dynamic translation backend | ✅ | ✅ | — | — |
| Snapshot save + restore | ✅ | ✅ | — | ✅ |
| Autosnapshot (periodic) | ✅ | — | — | — |
| HTTP API for machine control | ✅ | — | — | — |
| WebSocket UART console endpoint | ✅ | — | — | — |
| Scriptable UART host bridge primitives | ✅ | — | — | ✅ |
| One‑command Debian kernel/initrd download with SHA256 verification | ✅ | — | — | — |
| Built‑in JIT‑vs‑interpreter differential checker | ✅ | — | — | — |
| GDB debugging workflow | — | ✅ | ✅ | ✅ |
| Large RISC‑V board/device ecosystem (PCIe/virtio on virt) | — | ✅ | — | — |
| Multi‑node simulation focus | — | — | — | ✅ |
| Broad ISA extension coverage (incl. RVV, crypto, etc.) | — | — | — | ✅ |
QEMU’s virt machine is a heavyweight solution that supports a wide range of peripherals and multi‑node setups, but its startup time is longer because the TCG translator must decode each instruction. Spike is a pure interpreter that is easy to embed in test harnesses, yet it lacks snapshot and API features. Renode provides a rich visual environment and multi‑node simulation, but its Rust‑centric workflow is limited and it requires a separate runtime.
emuko’s snapshot and API capabilities give it an edge for automated testing. The JIT backend reduces boot latency, making it comparable to QEMU for simple workloads. However, the lack of PCIe and virtio support means it cannot replace QEMU for board‑level validation. The differential checker is a unique safety net that is absent from QEMU and Renode.
How to use it
The project ships a single binary, target/release/emuko, after a cargo build --release. The quick‑start workflow consists of three commands:
- Download a kernel –
emuko dowfetches a Debian netboot kernel and initrd to~/.emuko/and verifies their SHA‑256 hashes against the upstream release. - Start the daemon –
emuko startlaunches the emulator in background mode, attaches an interactive UART console, and prints the kernel boot messages. Keyboard shortcuts let you detach (Ctrl+]), send an interrupt (Ctrl+C), or send an EOF (Ctrl+D). - Control the machine –
emuko dumpprints the current CPU state,emuko stoppauses execution,emuko conresumes,emuko step 1000advances a fixed number of instructions,emuko snapcreates a snapshot, andemuko restore <snapshot>brings the machine back to a saved point.
Configuration can be passed after emuko start or set through environment variables (RAM_SIZE, EMUKO_BACKEND) or a emuko.yml file. The default RAM size is 1 GB, and the backend defaults to adaptive, which chooses the fastest path based on the host architecture.
Licensing and dependencies
The code is released under the Apache 2.0 license, which permits commercial use, modification, and redistribution with attribution. The only external dependency is the zstd compression library, which is used for snapshot archives. All other components are pure Rust, keeping the build footprint small.
Market positioning and funding outlook
At present emuko is a hobby project with no external financing. Its creator has not disclosed any venture backing or corporate sponsorship. The lack of funding is typical for many open‑source emulators that start as personal experiments. However, the project aligns with several emerging trends that could attract support.
RISC‑V adoption is accelerating in embedded systems, cloud servers, and academic research. Companies such as SiFive, Western Digital, and Alibaba have invested heavily in RISC‑V tooling. An emulator that can boot Linux quickly and expose a programmable API could become a component of a larger development suite offered by a RISC‑V‑focused startup. Potential investors might include venture capital firms that back developer‑tool companies, corporate R&D units looking for internal testing infrastructure, or open‑source foundations that fund infrastructure projects.
The most immediate commercial angle is integration into CI pipelines. A lightweight emulator that can run a full kernel in seconds would allow hardware‑agnostic regression testing for RISC‑V firmware. Cloud providers could bundle emuko as a service for developers who need rapid prototyping without physical boards. In such scenarios, licensing revenue could come from per‑user subscriptions or from bundled support contracts.
Limitations and future work
The current implementation does not support the Vector Extension (RVV) or cryptographic extensions, which are increasingly common in newer RISC‑V cores. Peripheral modeling is limited to the UART, CLINT, PLIC, and SBI devices; PCIe, virtio, and other board‑level buses are missing. The snapshot format relies on zstd compression; while this keeps archive sizes manageable, it adds a dependency on a compression library that may not be available in all embedded environments.
The roadmap posted on the repository mentions adding RVV support, expanding peripheral models, and improving multi‑node simulation. The author also plans to expose a gRPC interface in addition to the HTTP API, which could simplify integration with existing test frameworks. These enhancements would broaden the emulator’s appeal but would also increase the code base and potentially introduce new bugs.
Why it matters
emuko demonstrates that a modern, Rust‑based emulator can achieve boot times comparable to larger tools while offering a developer‑oriented API. Its snapshot and differential checking features address pain points that have long plagued emulator users. For teams that need fast feedback loops without the overhead of full‑system simulators, emuko provides a viable alternative.
The project’s open‑source nature means anyone can inspect the translation logic, contribute new peripherals, or adapt the snapshot format for custom use cases. The Apache 2.0 license removes many legal barriers, encouraging adoption in both academic and commercial settings.
Where to find it
- Project homepage: emuko.dev
- GitHub repository: wkoszek/emuko
- Quick‑start guide: README
- Comparison table source: README comparison
- QEMU RISC‑V virt documentation: QEMU RISC‑V virt machine docs
- QEMU GDB usage: QEMU GDB usage
- Spike README: riscv‑isa‑sim
- Renode documentation: Renode docs
The emulator is still early in its lifecycle, but its combination of speed, API exposure, and safety checks makes it worth watching for anyone building RISC‑V software pipelines.

Comments
Please log in or register to join the discussion