- uvm32 là một sandbox máy ảo tối giản dành cho môi trường tài nguyên hạn chế như vi điều khiển, được cấu thành từ một tệp C duy nhất và hoạt động không cần cấp phát bộ nhớ động
- Dựa trên trình giả lập RISC-V, nó chạy các ứng dụng bytecode được viết bằng C, Zig, Rust và assembly, với thiết kế bất đồng bộ giúp ngăn host bị treo
- Có thể hoạt động với dưới 3KB flash, dưới 1KB RAM, ưu tiên độ an toàn để mã lỗi không làm host bị crash
- Cung cấp nhiều ví dụ VM host và ứng dụng mẫu theo từng ngôn ngữ, có thể tích hợp vào nhiều môi trường như embedded, game, plugin
- Được phát hành theo giấy phép MIT, có thể tự do sử dụng trong nghiên cứu, sản phẩm và thiết bị embedded
Tổng quan về uvm32
- uvm32 là một sandbox máy ảo gọn nhẹ không phụ thuộc thư viện, được thiết kế cho vi điều khiển và các thiết bị bị giới hạn tài nguyên
- Cấu trúc một tệp C duy nhất, dựa trên chuẩn C99, thiết kế bất đồng bộ, không dùng bộ nhớ động
- Trên STM32L0 (ARM Cortex-M0+), có thể chạy với 3KB flash / 1KB RAM hoặc ít hơn
- Dựa trên trình giả lập RISC-V, đồng thời bao gồm giao diện quản lý và công cụ build mã hiệu quả
Mục đích sử dụng chính
- Thay thế các engine scripting embedded như Lua, Duktape, MicroPython
- Cô lập mã không đáng tin cậy thông qua môi trường sandbox
- Hỗ trợ phát triển bằng các ngôn ngữ hệ thống hiện đại như Rust, Zig
- Giảm thiểu bảo trì đa nền tảng theo nguyên tắc “Write once, run anywhere”
Tính năng chính
- Bao gồm các ví dụ bytecode viết bằng C, Zig, Rust, assembly
- Thiết kế non-blocking giúp mã bất thường không làm host dừng hoạt động
- Không giả định host có I/O, mô hình thực thi đơn giản và nhất quán
- Cung cấp FFI tối giản an toàn
- Có thể chạy từ script nhỏ đến ứng dụng phức tạp
- Thiết kế ưu tiên an toàn, lỗi bên trong VM không làm hỏng host
- Dù dựa trên trình giả lập CPU hoàn chỉnh, nhưng không nhằm mục đích mô phỏng phần cứng
So sánh với các lựa chọn thay thế
- Dấu chân bộ nhớ nhỏ hơn so với các engine scripting embedded hiện có
- Hỗ trợ các ngôn ngữ được dùng rộng rãi như C, Rust, Zig
- Dễ tích hợp với phần mềm hiện có
- Hỗ trợ nhiều mô hình như event-driven, polling, multiprocessor
- Đảm bảo độ bền vững trước mã VM bất thường
- Tuy vậy, các mục tiêu như gọi FFI trực tiếp, hiệu năng tối đa, trải nghiệm scripting đơn giản, tích hợp sẵn thư viện chuẩn không phải là trọng tâm
Build và chạy thử (Docker)
- Có thể build chỉ với trình biên dịch C, đồng thời cung cấp môi trường Docker
- Có thể thiết lập môi trường bằng các lệnh
make dockerbuild, make dockershell
- Sau khi chạy
make trong shell Docker,
có thể thực thi ./hosts/host/host apps/helloworld/helloworld.bin
- Có thể xem toàn bộ tùy chọn bằng lệnh
host -h
Giấy phép
- Áp dụng MIT License
- Có thể tự do sử dụng trong nghiên cứu, sản phẩm và thiết bị embedded
3 bình luận
Ý kiến Hacker News
Xem qua mã nguồn thì đúng là có cấu trúc rất gọn
Tôi chưa tự biên dịch hay chạy thử, nhưng nó bao gồm các phần mở rộng lệnh số nguyên, phép nhân và nguyên tử của RISC-V 32-bit
Các phép toán dấu phẩy động không được trình giả lập xử lý mà được trình biên dịch (
gccv.v.) mô phỏng bằng các hàm phần mềmTôi nghĩ việc hỗ trợ từ nhiều trình biên dịch là một thiết kế rất khéo léo
Dự án nền tảng triển khai bộ lệnh thực tế là mini-rv32ima
Có vẻ dự án này nằm trong cùng một không gian với các nỗ lực tạo ra môi trường thực thi chung như WASM
Chỉ khác là nền tảng ở đây là RISC-V
Tôi muốn biết thêm về hạn chế hay ưu điểm của từng cách tiếp cận, nhưng dù sao thì có vẻ chúng ta đang tiến tới một tương lai nơi ứng dụng chạy trên một VM chung
Tôi nghĩ web hiện đại là ví dụ gần nhất với điều đó
libriscv cũng là một dự án rất hay và ấn tượng
Tham khảo, liên kết thảo luận liên quan ở đây
Tuy vậy, RISC-V có thể không phù hợp cho kiểu sử dụng này
Ví dụ, nếu xử lý giải mã giá trị tức thời bằng phần mềm thì sẽ chậm, còn trong phần cứng thì nhanh
Dù vậy, RISC-V vẫn là một mục tiêu có thể cấu hình theo hướng ổn định và đơn giản
Mã nguồn rất sạch sẽ và tôi thích cấu trúc một tệp C duy nhất
Cách dùng Docker để chạy ví dụ cũng rất tiện trong môi trường nhúng
Độ bao phủ kiểm thử cũng có vẻ tốt, và sẽ rất thú vị nếu xem các chỉ số đo lường
Khi thêm tính năng scripting vào thiết bị y tế, có vẻ điều này có lợi ở chỗ không cần phải tái xác minh phần mã lõi mỗi lần
Sẽ rất thú vị nếu so sánh với các trình thông dịch WASM cho nhúng như WASM Micro Runtime
Trên Cortex M4F, nó lớn hơn nhiều với mức 56.3K
Có lẽ vì WASM là một tập lệnh phức tạp hơn so với hồ sơ RISC-V tối thiểu
Nhưng WAMR bao gồm nhiều phần mở rộng như GC, JIT, WASI, luồng và hỗ trợ debugger
Có người giới thiệu ví dụ ZigDoom với câu “Just add rats”
Thời điểm quá chuẩn
Tôi đang tìm một trình giả lập nhẹ để kiểm thử firmware nhúng, mà hầu hết các lựa chọn khác đều quá nặng hoặc thiếu ổn định
Nếu hỗ trợ mô phỏng IO ánh xạ bộ nhớ, nó có vẻ sẽ hữu ích để kiểm thử driver IoT hay vi điều khiển mà không cần phần cứng thật
Lõi giả lập đã hỗ trợ IO ánh xạ bộ nhớ, nhưng uvm32 chỉ dùng nó như các khối RAM bổ sung trên host (framebuffer hay heap riêng, v.v.)
Bẫy ghi có thể xử lý ở đoạn này, còn bẫy đọc thì ở đoạn này
Tôi không biết rốt cuộc cái đoạn lừa đảo ở cuối là xuất phát từ bình luận nào nữa.
Có vẻ bình luận đó đã bị đánh dấu là spam nên biến mất, chỉ còn lại bình luận trả lời nên trông hơi kỳ. Tôi sẽ xóa đi.