uvm32 - C로 작성된 초소형 VM 샌드박스, Rust·C·Zig 앱 실행 지원
(github.com/ringtailsoftware)- uvm32는 마이크로컨트롤러 등 제한된 자원 환경용의 미니멀한 가상 머신 샌드박스로, 단일 C 파일로 구성되고 동적 메모리 할당 없이 동작
- RISC-V 에뮬레이터 기반으로, C·Zig·Rust·어셈블리로 작성된 바이트코드 앱을 실행하며, 비동기 설계로 호스트 정지 방지
- 3KB 이하 플래시, 1KB 이하 RAM으로 동작 가능하며, 안전성을 우선시해 잘못된 코드가 호스트를 크래시시키지 않음
- 다양한 VM 호스트 예제와 언어별 샘플 앱을 제공해, 임베디드·게임·플러그인 등 다양한 환경에 통합 가능
- MIT 라이선스로 공개되어 연구, 제품, 임베디드 장치에서 자유롭게 활용 가능
uvm32 개요
-
uvm32는 의존성 없는 경량 가상 머신 샌드박스로, 마이크로컨트롤러 및 자원 제약 장치용으로 설계
- 단일 C 파일 구조, C99 표준 기반, 비동기 설계, 동적 메모리 미사용
- STM32L0(ARM Cortex-M0+) 기준 3KB 플래시 / 1KB RAM 이하로 동작
- RISC-V 에뮬레이터를 기반으로 하며, 관리 인터페이스와 효율적 코드 빌드 도구를 포함
주요 활용 목적
- Lua, Duktape, MicroPython 등의 임베디드 스크립트 엔진 대체
- 샌드박스 환경을 통한 신뢰할 수 없는 코드 격리
- Rust, Zig 등 현대 시스템 언어로 개발 가능하게 지원
- “Write once, run anywhere” 원칙으로 다중 플랫폼 유지보수 최소화
주요 특징
- C, Zig, Rust, 어셈블리로 작성된 바이트코드 예제 포함
- 논블로킹 설계로 비정상 코드가 호스트를 멈추지 않음
- 호스트 I/O 가정 없음, 단순하고 일관된 실행 모델
- 안전한 최소형 FFI 제공
- 소형 스크립트부터 복잡한 애플리케이션까지 실행 가능
- 안전성 우선 설계, VM 내부 오류가 호스트를 손상시키지 않음
- 완전한 CPU 에뮬레이터 기반이지만, 하드웨어 시뮬레이션 목적 아님
대안들과의 비교
- 기존 임베디드 스크립트 엔진 대비 작은 메모리 풋프린트
- C, Rust, Zig 등 널리 사용되는 언어 지원
- 기존 소프트웨어와의 통합 용이성
- 이벤트 기반·폴링·멀티프로세서 등 다양한 패러다임 지원
- 비정상 VM 코드에 대한 강인성 확보
- 반면, 직접 FFI 호출, 최대 효율성, 간단한 스크립팅 경험, 표준 라이브러리 내장은 목표하지 않음
빌드 및 실행 (Docker)
-
C 컴파일러만으로 빌드 가능, Docker 환경 제공
-
make dockerbuild,make dockershell명령으로 환경 구성 - Docker 셸 내부에서
make실행 후,
./hosts/host/host apps/helloworld/helloworld.bin실행 가능
-
-
host -h명령으로 전체 옵션 확인 가능
라이선스
- MIT License 적용
- 연구, 제품, 임베디드 장치 등에서 자유롭게 사용 가능
Hacker News 의견들
-
코드를 살펴보니 정말 컴팩트한 구조였음
직접 컴파일하거나 실행해보진 않았지만, RISC-V 32비트 정수·곱셈·원자 명령 확장을 포함하고 있음
부동소수점 연산은 에뮬레이터가 아니라 컴파일러(gcc 등)가 소프트웨어 함수로 에뮬레이션함
여러 컴파일러에서 지원된다는 점이 매우 영리한 설계라고 생각함
실제 명령어 세트를 구현한 기반 프로젝트는 mini-rv32ima임 -
이 프로젝트가 WASM처럼 공통 실행 환경을 만들려는 시도와 비슷한 영역에 있는 것 같음
다만 기반이 RISC-V라는 점이 다름
각 접근 방식의 한계나 장점을 더 알고 싶지만, 어쨌든 애플리케이션이 공통 VM 위에서 동작하는 미래로 가고 있는 듯함
현대 웹이 그에 가장 가까운 예시라고 생각함- 예전에 WASM과 libriscv를 간단히 비교해봤는데, 브라우저 호환성 때문에 WASM을 선택했음
libriscv도 멋지고 인상적인 프로젝트임
참고로 관련 토론 링크는 여기에 있음 -
Google 오픈소스 블로그의 Wasefire 글을 보면, 코드 풋프린트가 더 작아 보임
다만 RISC-V는 이런 용도에는 적합하지 않을 수도 있음
예를 들어 즉시값 디코딩을 소프트웨어로 처리하면 느려지지만, 하드웨어에서는 빠름
그래도 RISC-V는 안정적이고 단순하게 구성할 수 있는 타깃임
- 예전에 WASM과 libriscv를 간단히 비교해봤는데, 브라우저 호환성 때문에 WASM을 선택했음
-
코드가 정말 깔끔하고 단일 C 파일 구조가 마음에 듦
예제 실행을 위해 Docker를 쓰는 방식도 임베디드 환경에서 매우 편리함
테스트 커버리지도 좋아 보이고, 메트릭을 보는 것도 흥미로울 것 같음
의료기기에 스크립팅 기능을 추가할 때, 핵심 코드를 매번 재검증하지 않아도 되는 장점이 있을 듯함
WASM Micro Runtime 같은 임베디드용 WASM 인터프리터와 비교해보면 흥미로움
Cortex M4F 기준으로 56.3K로 훨씬 큼
아마 WASM이 최소 RISC-V 프로파일보다 복잡한 명령어 집합이기 때문일 것임- wasm-mvp는 부동소수점 명령을 제외하면 매우 단순함
하지만 WAMR은 GC, JIT, WASI, 스레드, 디버거 지원 등 다양한 확장을 포함함
- wasm-mvp는 부동소수점 명령을 제외하면 매우 단순함
-
“Just add rats”라며 ZigDoom 예제를 소개함
-
타이밍이 절묘함
임베디드 펌웨어 테스트용 경량 에뮬레이터를 찾고 있었는데, 대부분의 대안은 너무 무겁거나 불안정했음
메모리 매핑된 IO 시뮬레이션을 지원하면, 실제 하드웨어 없이 IoT나 마이크로컨트롤러 드라이버 테스트에 유용할 것 같음