10P by GN⁺ 1일전 | ★ favorite | 댓글 3개
  • 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는 안정적이고 단순하게 구성할 수 있는 타깃임
  • 코드가 정말 깔끔하고 단일 C 파일 구조가 마음에 듦
    예제 실행을 위해 Docker를 쓰는 방식도 임베디드 환경에서 매우 편리함
    테스트 커버리지도 좋아 보이고, 메트릭을 보는 것도 흥미로울 것 같음
    의료기기에 스크립팅 기능을 추가할 때, 핵심 코드를 매번 재검증하지 않아도 되는 장점이 있을 듯함
    WASM Micro Runtime 같은 임베디드용 WASM 인터프리터와 비교해보면 흥미로움
    Cortex M4F 기준으로 56.3K로 훨씬 큼
    아마 WASM이 최소 RISC-V 프로파일보다 복잡한 명령어 집합이기 때문일 것임

  • “Just add rats”라며 ZigDoom 예제를 소개함

  • 타이밍이 절묘함
    임베디드 펌웨어 테스트용 경량 에뮬레이터를 찾고 있었는데, 대부분의 대안은 너무 무겁거나 불안정했음
    메모리 매핑된 IO 시뮬레이션을 지원하면, 실제 하드웨어 없이 IoT나 마이크로컨트롤러 드라이버 테스트에 유용할 것 같음

    • 이건 쉽게 구현 가능함
      에뮬레이터 코어가 이미 메모리 매핑 IO를 지원하지만, uvm32는 이를 호스트의 추가 RAM 블록(프레임버퍼나 별도 힙 등)으로만 사용함
      쓰기 트랩은 이 부분, 읽기 트랩은 이 부분에서 처리 가능함

마지막에 피싱 어쩌구는 대체 어느 댓글에서 나온건지 모르겠네요

그 댓글은 스팸으로 flag 되어서 사라져버려서 답댓글만 남아서 이상해진것 같아요. 지워 두겠습니다.