- uvm32 é um sandbox de máquina virtual minimalista para ambientes com recursos limitados, como microcontroladores, composto por um único arquivo C e que funciona sem alocação dinâmica de memória
- Baseado em um emulador RISC-V, executa apps em bytecode escritos em C, Zig, Rust e assembly e, com design assíncrono, evita travar o host
- Pode operar com menos de 3 KB de flash e menos de 1 KB de RAM e prioriza segurança para que código incorreto não derrube o host
- Fornece vários exemplos de hosts de VM e apps de exemplo por linguagem, permitindo integração em ambientes diversos, como embarcados, jogos e plugins
- Publicado sob a licença MIT, pode ser usado livremente em pesquisa, produtos e dispositivos embarcados
Visão geral do uvm32
- uvm32 é um sandbox de máquina virtual leve e sem dependências, projetado para microcontroladores e dispositivos com restrição de recursos
- Estrutura em um único arquivo C, baseada no padrão C99, com design assíncrono e sem uso de memória dinâmica
- Em um STM32L0 (ARM Cortex-M0+), opera com menos de 3 KB de flash / 1 KB de RAM
- É baseado em um emulador RISC-V e inclui interface de gerenciamento e ferramentas eficientes de build de código
Principais objetivos de uso
- Substituir engines de script embarcadas como Lua, Duktape e MicroPython
- Isolar código não confiável por meio de um ambiente sandbox
- Permitir desenvolvimento com linguagens de sistema modernas, como Rust e Zig
- Minimizar a manutenção multiplataforma com o princípio “Write once, run anywhere”
Principais características
- Inclui exemplos de bytecode escritos em C, Zig, Rust e assembly
- O design non-blocking impede que código anômalo pare o host
- Não presume I/O do host, com um modelo de execução simples e consistente
- Oferece uma FFI mínima e segura
- Pode executar desde scripts pequenos até aplicações complexas
- Design com foco em segurança, em que erros internos da VM não comprometem o host
- Embora seja baseado em um emulador completo de CPU, não tem como objetivo simulação de hardware
Comparação com alternativas
- Pegada de memória menor que a de engines de script embarcadas tradicionais
- Suporte a linguagens amplamente usadas, como C, Rust e Zig
- Facilidade de integração com software existente
- Suporte a vários paradigmas, como baseado em eventos, polling e multiprocessador
- Robustez diante de código de VM defeituoso
- Por outro lado, chamadas FFI diretas, eficiência máxima, experiência de scripting simples e biblioteca padrão embutida não são objetivos do projeto
Build e execução (Docker)
- Pode ser compilado apenas com um compilador C e oferece ambiente Docker
- É possível preparar o ambiente com os comandos
make dockerbuild e make dockershell
- Depois de executar
make dentro do shell do Docker,
é possível rodar ./hosts/host/host apps/helloworld/helloworld.bin
- O comando
host -h mostra todas as opções disponíveis
Licença
- Aplica-se a MIT License
- Pode ser usado livremente em pesquisa, produtos e dispositivos embarcados
3 comentários
Comentários do Hacker News
Ao olhar o código, achei a estrutura realmente compacta
Não compilei nem executei por conta própria, mas ele inclui as extensões RISC-V de inteiros de 32 bits, multiplicação e instruções atômicas
As operações de ponto flutuante não são emuladas pelo emulador; o compilador (
gccetc.) as emula por meio de funções de softwareAcho isso um design muito inteligente, especialmente por ser compatível com vários compiladores
O projeto-base que implementa o conjunto real de instruções é o mini-rv32ima
Este projeto parece estar em uma área parecida com as tentativas de criar um ambiente de execução comum como o WASM
A diferença é que aqui a base é o RISC-V
Queria entender melhor as limitações e vantagens de cada abordagem, mas, de todo modo, parece que estamos caminhando para um futuro em que os aplicativos rodam sobre uma VM comum
Acho que a web moderna é o exemplo mais próximo disso
O libriscv também é um projeto muito legal e impressionante
Para referência, a discussão relacionada está aqui
Ainda assim, RISC-V talvez não seja o mais adequado para esse tipo de uso
Por exemplo, decodificar valores imediatos em software é lento, embora em hardware seja rápido
Mesmo assim, RISC-V é um alvo estável e simples de compor
O código é realmente limpo e gostei da estrutura em um único arquivo C
A forma de usar Docker para executar os exemplos também é muito prática em ambientes embarcados
A cobertura de testes também parece boa, e seria interessante ver as métricas
Ao adicionar recursos de script a dispositivos médicos, isso pode trazer a vantagem de não precisar revalidar o código principal toda vez
Seria interessante comparar com interpretadores WASM para embarcados, como o WASM Micro Runtime
No Cortex M4F, ele é bem maior, com 56.3K
Provavelmente porque o WASM tem um conjunto de instruções mais complexo do que o perfil mínimo do RISC-V
Mas o WAMR inclui várias extensões, como suporte a GC, JIT, WASI, threads e depurador
Apresentaram o exemplo ZigDoom com a frase “Just add rats”
Timing perfeito
Eu estava procurando um emulador leve para testar firmware embarcado, mas a maioria das alternativas era pesada demais ou instável
Se houver suporte para simulação de IO mapeado em memória, isso pode ser útil para testar drivers de IoT ou microcontroladores sem hardware real
O núcleo do emulador já suporta IO mapeado em memória, mas o uvm32 usa isso apenas como blocos extras de RAM do host (framebuffer ou heap separado, por exemplo)
O trap de escrita pode ser tratado nesta parte, e o trap de leitura nesta parte
No fim das contas, não sei de qual comentário saiu aquele papo de phishing.
Aquele comentário foi marcado como spam e acabou sumindo, então parece que só ficou a resposta e ficou estranho. Vou apagar isso.