-
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 호출, 최대 효율성, 간단한 스크립팅 경험, 표준 라이브러리 내장은 목표하지 않음
리포지토리 구성
- 핵심 코드는 uvm32/ 디렉터리에 위치
-
host-mini는 최소 예제 호스트로, VM 실행 구조를 단순히 보여줌
- 기타 디렉터리는 고급 호스트 예제 또는 실행 가능한 샘플 앱 포함
예제 코드
-
host-mini 예제는 uvm32_init, uvm32_load, uvm32_run 함수를 사용해 바이트코드를 실행
-
시스템 호출(UVM32_SYSCALL) 이벤트를 처리하며, 출력·문자열·에러 이벤트를 구분
샘플 구성
-
VM 호스트 예제
-
host: 다양한 syscall 처리 포함한 완전 실행형 호스트
-
host-mini: 최소형 호스트, 내장 바이트코드 포함
-
host-parallel: 여러 VM 인스턴스를 병렬 실행
-
host-arduino: Arduino 스케치 형태, QEMU로 AVR 코드 테스트 가능
-
C 앱 예제
-
helloworld, heap, conio, lissajous, maze, fib, sketch 등
-
Rust 앱 예제
-
rust-hello: Rust로 작성된 Hello World
-
Zig 앱 예제
-
zig-mandel, zigtris, zigalloc, zigdoom, tinygl 등
-
어셈블리 앱 예제
-
hello-asm: 최소형 Hello World
-
VM 내 VM 실행 예제
-
apps/self: VM이 또 다른 VM을 실행하는 구조
빌드 및 실행 (Docker)
-
C 컴파일러만으로 빌드 가능, Docker 환경 제공
-
make dockerbuild, make dockershell 명령으로 환경 구성
- Docker 셸 내부에서 make 실행 후,
./hosts/host/host apps/helloworld/helloworld.bin 실행 가능
-
host -h 명령으로 전체 옵션 확인 가능
추가 정보
- 주요 문서는 uvm32/uvm32.h 헤더와 test/ 디렉터리 내 테스트 코드
-
make test 실행 시 테스트 커버리지 리포트 자동 생성
- 추가 문서는 doc/README.md 참고
라이선스
-
MIT License 적용
- 연구, 제품, 임베디드 장치 등에서 자유롭게 사용 가능