Guest Support
RVM paravirtualizes RTOS kernels with drop-in port layers: the guest library mirrors the relative layout of each official RTOS tree and contains only the files that were added — official kernel files are never included or modified, so a plain overlay is always safe.
Support matrix
| Guest | Version | Status | ARMv6-M | ARMv7-M | RV32 (RISC-V) | Toolchains |
|---|---|---|---|---|---|---|
| RMP | latest | Practical | ✅ | ✅ | ✅ | Keil, IAR, GCC |
| FreeRTOS | V9.0.0 | Practical | ✅ | ✅ | ✅ | Keil (RVDS), IAR, GCC |
| uC/OS-II | V2.93 | Practical | ✅ | ✅ | ✅ | Keil (RVDS), IAR, GCC |
| uC/OS-III | V3.08.02 | Practical | ✅ | ✅ | ✅ | Keil (RVDS), IAR, GCC |
| RT-Thread | V4.1.1 | Practical | ✅ | ✅ | ✅ | Keil (RVDS), IAR, GCC (RV32: GCC only) |
| DjyOS | V1.1.0 | Commemorative | — | ✅ M7 only | — | GCC (STM32H743 only) |
| KLite | V5.2.1 | Commemorative | — | ✅ M7 only | — | GCC (STM32H743 only) |
- Practical ports cover the full architecture/toolchain matrix above and are measured in the benchmark tables.
- Commemorative ports are memorial single-combination ports (Cortex-M7 + GCC + STM32H743ZIT6). They demonstrate the porting technique on kernels with a fixed single combination.
- RMP is not distributed in the guest library: it carries its RVM platform layers natively (
Source/Platform/*_RVM/in the RMP tree) and needs no guest-side packaging.
Evaluation boards
Cortex-M0+: STM32G071RBT6 · Cortex-M4: STM32F429ZIT6 · Cortex-M7: STM32H743ZIT6 · RV32IMAC: CH32V307VCT6
Per-guest notes
RMP
EDI's own real-time kernel. It defines the original RVM switch template that every other port transplants: locked-state yield requests become a kernel pend flag replayed at unlock, so the port only ever sees unmasked, immediate switch requests.
FreeRTOS
A software deferred-yield that mimics the official PendSV pend via a nesting counter. configUSE_RVM_OPTIMISED_YIELD selects between the task-stack fast path and the pure-hypercall yield (which costs ~4x Yield latency with identical semantics); on RV32P, configUSE_PORT_RVF/configUSE_PORT_RVD select the FPU frame width.
uC/OS-II
Self-contained (no uC-CPU/uC-LIB). OS_CPU_SR_Save/Restore map onto the RVM virtual interrupt mask snapshot; clean frames take the assembly fast path, dirty ones the yield hypercall. Kernel objects must be created from a task context, so applications boot from an init task.
uC/OS-III
OS_CFG_RVM_FAST_YIELD_EN toggles the same fast/hypercall trade-off as FreeRTOS. The direct switch always lands the incoming task unmasked, preserving the kernel's Disable; Yield; Enable contract.
RT-Thread
Fast path for clean frames, deferred hypercall path for dirty ICI/IT frames. Requires RT_USING_LIBC. On RV32P the port is GCC-only.
DjyOS (commemorative)
DjyOS schedules events; every switch runs inside the kernel's async-signal mask. The port hosts all threads in one RVM user thread and masquerades contexts as 22-word exception frames. The guest must be compiled with -mfloat-abi=soft.
KLite (commemorative)
The always-deferred kernel shape: cpu_contex_switch() only pends, and the outermost cpu_leave_critical() consumes the pend through a yield dispatcher with a masquerade fast path. Selected in the project generator with the -klt flag.
Port contracts
Every port implements the same five-part job — critical sections, yield, context switch, interrupt delivery hooks and startup — while each kernel guarantees something different. The full contract/strategy analysis for each guest (including the interrupt model's three-layer gate and frame interchangeability) lives in the GUEST.md document in the repository.
For installation (tree overlay) and project generation, see Getting Started.
