- uvm32 es un sandbox de máquina virtual minimalista para entornos con recursos limitados como microcontroladores, compuesto por un solo archivo C y que funciona sin asignación dinámica de memoria
- Basado en un emulador RISC-V, ejecuta apps de bytecode escritas en C, Zig, Rust y ensamblador, con un diseño asíncrono para evitar que el host se bloquee
- Puede operar con menos de 3 KB de flash y menos de 1 KB de RAM; prioriza la seguridad para que el código defectuoso no haga colapsar al host
- Ofrece varios ejemplos de hosts de VM y apps de muestra por lenguaje, por lo que puede integrarse en entornos embebidos, juegos, plugins y más
- Se publica bajo licencia MIT, lo que permite usarlo libremente en investigación, productos y dispositivos embebidos
Resumen de uvm32
- uvm32 es un sandbox ligero de máquina virtual sin dependencias, diseñado para microcontroladores y dispositivos con restricciones de recursos
- Estructura de un solo archivo C, basado en el estándar C99, diseño asíncrono y sin uso de memoria dinámica
- En un STM32L0 (ARM Cortex-M0+) puede funcionar con menos de 3 KB de flash / 1 KB de RAM
- Está basado en un emulador RISC-V e incluye una interfaz de administración y herramientas eficientes para compilar código
Objetivos principales de uso
- Sustituir motores de scripting embebido como Lua, Duktape y MicroPython
- Aislar código no confiable mediante un entorno sandbox
- Permitir el desarrollo con lenguajes modernos de sistemas como Rust y Zig
- Minimizar el mantenimiento multiplataforma bajo el principio “Write once, run anywhere”
Características principales
- Incluye ejemplos de bytecode escritos en C, Zig, Rust y ensamblador
- El diseño no bloqueante evita que código anómalo detenga al host
- No asume I/O del host, con un modelo de ejecución simple y consistente
- Proporciona una FFI mínima y segura
- Puede ejecutar desde scripts pequeños hasta aplicaciones complejas
- Diseño con prioridad en la seguridad: los errores internos de la VM no dañan al host
- Aunque se basa en un emulador completo de CPU, no está pensado para simulación de hardware
Comparación con alternativas
- Frente a motores de scripting embebido existentes, tiene una huella de memoria menor
- Soporta lenguajes ampliamente usados como C, Rust y Zig
- Facilidad de integración con software existente
- Compatible con diversos paradigmas como basado en eventos, polling y multiprocesador
- Ofrece robustez ante código de VM defectuoso
- En cambio, no busca ofrecer llamadas FFI directas, máxima eficiencia, una experiencia de scripting sencilla ni biblioteca estándar integrada
Compilación y ejecución (Docker)
- Puede compilarse solo con un compilador de C, y ofrece un entorno Docker
- El entorno puede prepararse con los comandos
make dockerbuild y make dockershell
- Dentro del shell de Docker, tras ejecutar
make,
se puede correr ./hosts/host/host apps/helloworld/helloworld.bin
- El comando
host -h permite ver todas las opciones
Licencia
- Aplica la MIT License
- Puede usarse libremente en investigación, productos y dispositivos embebidos
3 comentarios
Comentarios en Hacker News
Al revisar el código, se veía realmente con una estructura compacta
No lo compilé ni lo ejecuté yo mismo, pero incluye las extensiones de enteros, multiplicación y operaciones atómicas de RISC-V de 32 bits
Las operaciones de punto flotante no las emula el emulador, sino el compilador (como gcc) mediante funciones de software
Me parece un diseño muy ingenioso que funcione con varios compiladores
El proyecto base que implementa el conjunto real de instrucciones es mini-rv32ima
Parece que este proyecto está en un terreno parecido al de los intentos de crear un entorno de ejecución común como WASM
La diferencia es que aquí la base es RISC-V
Me gustaría entender mejor las limitaciones y ventajas de cada enfoque, pero en cualquier caso parece que vamos hacia un futuro en el que las aplicaciones corran sobre una VM común
Creo que la web moderna es el ejemplo más cercano a eso
libriscv también es un proyecto genial e impresionante
Por cierto, el enlace a la discusión relacionada está aquí
Aun así, quizá RISC-V no sea lo más adecuado para este tipo de uso
Por ejemplo, decodificar inmediatos por software es lento, aunque en hardware es rápido
Aun así, RISC-V es un objetivo que puede mantenerse estable y simple
El código está realmente limpio y me gusta la estructura de un solo archivo C
La forma de usar Docker para ejecutar los ejemplos también es muy conveniente en entornos embebidos
La cobertura de pruebas también parece buena, y sería interesante ver las métricas
Al agregar capacidades de scripting a dispositivos médicos, podría tener la ventaja de no tener que revalidar el código central cada vez
Sería interesante compararlo con intérpretes WASM para embebidos como WASM Micro Runtime
En Cortex M4F, este último es mucho más grande, con 56.3K
Probablemente se deba a que WASM tiene un conjunto de instrucciones más complejo que el perfil mínimo de RISC-V
Pero WAMR incluye varias extensiones como GC, JIT, WASI, hilos y soporte de depurador
Presentan el ejemplo de ZigDoom con la frase “Just add rats”
El timing es perfecto
Estaba buscando un emulador liviano para probar firmware embebido, pero la mayoría de las alternativas eran demasiado pesadas o inestables
Si soporta simulación de IO mapeada en memoria, podría ser útil para probar drivers de IoT o microcontroladores sin hardware real
El núcleo del emulador ya soporta IO mapeada en memoria, pero uvm32 solo lo usa como bloques extra de RAM en el host (como framebuffer o heap separado)
Los traps de escritura pueden manejarse aquí, y los de lectura aquí
No tengo idea de en cuál comentario salió eso del phishing al final.
Parece que ese comentario fue marcado como spam y desapareció, así que solo quedó la respuesta y por eso se ve raro. Lo borraré.