- uvm32, mikrodenetleyiciler gibi kaynakları kısıtlı ortamlara yönelik minimal bir sanal makine sandbox'ıdır; tek bir C dosyasından oluşur ve dinamik bellek ayırımı olmadan çalışır
- RISC-V emülatörü tabanlıdır; C, Zig, Rust ve assembly ile yazılmış bayt kodu uygulamalarını çalıştırır ve asenkron tasarımıyla host'un durmasını önler
- 3KB altı flash, 1KB altı RAM ile çalışabilir; güvenliği önceliklendirdiği için hatalı kod host'u çökertmez
- Çeşitli VM host örnekleri ve dillere göre örnek uygulamalar sunar; bu sayede embedded, oyun, eklenti gibi farklı ortamlara entegre edilebilir
- MIT lisansı ile yayımlanmıştır; araştırma, ürünler ve embedded cihazlarda serbestçe kullanılabilir
uvm32 genel bakış
- uvm32, bağımlılığı olmayan hafif bir sanal makine sandbox'ıdır; mikrodenetleyiciler ve kaynak kısıtlı cihazlar için tasarlanmıştır
- Tek C dosyası yapısı, C99 standardı temelli, asenkron tasarım, dinamik bellek kullanımı yok
- STM32L0 (ARM Cortex-M0+) için 3KB flash / 1KB RAM altında çalışır
- RISC-V emülatörü temel alınmıştır ve yönetim arayüzü ile verimli kod derleme araçlarını içerir
Başlıca kullanım amaçları
- Lua, Duktape, MicroPython gibi embedded script motorlarının yerine geçmek
- Sandbox ortamı üzerinden güvenilmeyen kodu izole etmek
- Rust, Zig gibi modern sistem dilleri ile geliştirmeyi desteklemek
- “Write once, run anywhere” ilkesiyle çoklu platform bakım yükünü en aza indirmek
Temel özellikler
- C, Zig, Rust, assembly ile yazılmış bayt kodu örnekleri içerir
- Non-blocking tasarım sayesinde anormal kod host'u durdurmaz
- Host I/O varsayımı yoktur, basit ve tutarlı bir yürütme modeli sunar
- Güvenli ve minimal bir FFI sağlar
- Küçük script'lerden karmaşık uygulamalara kadar çalıştırabilir
- Güvenlik öncelikli tasarım sayesinde VM içindeki hatalar host'a zarar vermez
- Tam CPU emülatörü tabanlıdır, ancak donanım simülasyonu amacı taşımaz
Alternatiflerle karşılaştırma
- Mevcut embedded script motorlarına kıyasla daha küçük bellek ayak izi
- C, Rust, Zig gibi yaygın kullanılan diller desteği
- Mevcut yazılımlarla kolay entegrasyon
- Olay tabanlı, polling, çok işlemcili gibi çeşitli paradigmaları destekler
- Anormal VM koduna karşı dayanıklılık sağlar
- Buna karşılık doğrudan FFI çağrıları, maksimum verimlilik, basit bir scripting deneyimi ve gömülü standart kütüphane hedefleri arasında değildir
Derleme ve çalıştırma (Docker)
- Yalnızca C derleyicisiyle derlenebilir, Docker ortamı sunulur
- Ortamı hazırlamak için
make dockerbuild, make dockershell komutları kullanılabilir
- Docker shell içinde
make çalıştırdıktan sonra,
./hosts/host/host apps/helloworld/helloworld.bin çalıştırılabilir
host -h komutuyla tüm seçenekler görülebilir
Lisans
- MIT License uygulanır
- Araştırma, ürünler, embedded cihazlar vb. alanlarda serbestçe kullanılabilir
3 yorum
Hacker News görüşleri
Koda bakınca yapının gerçekten kompakt olduğunu gördüm
Doğrudan derleyip çalıştırmadım ama RISC-V 32 bit tamsayı, çarpma ve atomik komut uzantılarını içeriyor
Kayan nokta işlemleri emülatör tarafından değil, derleyici (
gccvb.) tarafından yazılım fonksiyonlarıyla emüle ediliyorBunun birden fazla derleyici tarafından desteklenmesi bence çok akıllıca bir tasarım
Gerçek komut setini uygulayan temel proje mini-rv32ima
Bu proje, WASM gibi ortak bir çalışma ortamı oluşturmaya yönelik girişimlerle benzer bir alanda duruyor gibi görünüyor
Farkı, temelinin RISC-V olması
Her yaklaşımın sınırlamalarını ve avantajlarını daha iyi bilmek isterim ama ne olursa olsun, uygulamaların ortak bir VM üzerinde çalıştığı bir geleceğe gidiyor gibiyiz
Modern web bunun en yakın örneği bence
libriscv de havalı ve etkileyici bir proje
İlgili tartışma bağlantısı burada
Ancak RISC-V bu tür kullanım için uygun olmayabilir
Örneğin immediate decoding işlemini yazılımda yapmak yavaş olabilir, ama donanımda hızlıdır
Yine de RISC-V, kararlı ve basit şekilde yapılandırılabilen bir hedef
Kod gerçekten temiz ve tek C dosyası yapısını beğendim
Örnekleri çalıştırmak için Docker kullanılması da gömülü ortamlarda çok pratik
Test kapsamı da iyi görünüyor ve metriklere bakmak da ilginç olabilir
Tıbbi cihazlara betik desteği eklerken, çekirdek kodu her seferinde yeniden doğrulamak zorunda kalmama gibi bir avantaj sağlayabilir
WASM Micro Runtime gibi gömülü sistemlere yönelik WASM yorumlayıcılarıyla karşılaştırmak ilginç
Cortex M4F için 56.3K ile çok daha büyük
Muhtemelen bunun nedeni, WASM’ın minimum RISC-V profilinden daha karmaşık bir komut kümesi olması
wasm-mvp, kayan nokta komutları hariç oldukça basitAncak WAMR; GC, JIT, WASI, thread, debugger desteği gibi çeşitli uzantılar içeriyor
“Just add rats” diyerek ZigDoom örneğini tanıtıyor
Zamanlaması cuk oturdu
Gömülü firmware testi için hafif bir emülatör arıyordum ama alternatiflerin çoğu ya fazla ağırdı ya da kararsızdı
Bellek eşlemeli IO simülasyonunu desteklerse, gerçek donanım olmadan IoT veya mikrodenetleyici sürücülerini test etmek için faydalı olabilir
Emülatör çekirdeği zaten bellek eşlemeli IO’yu destekliyor, ancak uvm32 bunu yalnızca host üzerindeki ek RAM blokları (framebuffer veya ayrı heap gibi) için kullanıyor
Yazma trap’i şurada, okuma trap’i ise şurada ele alınabilir
Sondaki phishing muhabbetinin tam olarak hangi yorumda geçtiğini gerçekten bilmiyorum.
O yorum spam olarak işaretlenip kaybolduğu için yalnızca yanıt yorum kalmış ve bu yüzden garipleşmiş gibi görünüyor. Kaldırayım.