- uvm32 คือ VM แซนด์บ็อกซ์แบบมินิมอล สำหรับ สภาพแวดล้อมทรัพยากรจำกัด เช่น ไมโครคอนโทรลเลอร์ โดยประกอบด้วยไฟล์ C เพียงไฟล์เดียวและทำงานได้โดยไม่ต้องจัดสรรหน่วยความจำแบบไดนามิก
- ทำงานบนพื้นฐานของ RISC-V emulator และรันแอปไบต์โค้ดที่เขียนด้วย C·Zig·Rust·แอสเซมบลี พร้อมการออกแบบแบบอะซิงโครนัสเพื่อ ป้องกันไม่ให้โฮสต์หยุดทำงาน
- สามารถทำงานได้ด้วย แฟลชน้อยกว่า 3KB และ RAM น้อยกว่า 1KB และให้ความสำคัญกับความปลอดภัยเป็นหลัก ทำให้โค้ดที่ผิดพลาด ไม่ทำให้โฮสต์แครช
- มีตัวอย่าง VM host หลากหลายแบบและแอปตัวอย่างแยกตามภาษา จึงสามารถผสานรวมเข้ากับสภาพแวดล้อมต่าง ๆ เช่น embedded·game·plugin
- เผยแพร่ภายใต้ MIT License จึงนำไปใช้ได้อย่างอิสระในงานวิจัย ผลิตภัณฑ์ และอุปกรณ์ embedded
ภาพรวมของ uvm32
- uvm32 เป็น VM แซนด์บ็อกซ์น้ำหนักเบา ที่ไม่มี dependency ออกแบบมาสำหรับไมโครคอนโทรลเลอร์และอุปกรณ์ที่มีข้อจำกัดด้านทรัพยากร
- โครงสร้างแบบไฟล์ C เดียว, อิงตามมาตรฐาน C99, การออกแบบแบบอะซิงโครนัส, ไม่ใช้หน่วยความจำแบบไดนามิก
- บน STM32L0 (ARM Cortex-M0+) สามารถทำงานได้ภายใน แฟลช 3KB / RAM 1KB หรือต่ำกว่า
- พัฒนาบนพื้นฐานของ RISC-V emulator และมีทั้งอินเทอร์เฟซสำหรับการจัดการกับเครื่องมือ build โค้ดที่มีประสิทธิภาพ
วัตถุประสงค์การใช้งานหลัก
- ใช้แทน embedded scripting engine เช่น Lua, Duktape, MicroPython
- แยกโค้ดที่ไม่น่าเชื่อถือออกจากกันผ่าน สภาพแวดล้อมแบบแซนด์บ็อกซ์
- รองรับการพัฒนาด้วย ภาษา system สมัยใหม่ เช่น Rust, Zig
- ลดภาระการดูแลรักษาหลายแพลตฟอร์มให้เหลือน้อยที่สุดตามหลัก “Write once, run anywhere”
คุณสมบัติหลัก
- มีตัวอย่างไบต์โค้ดที่เขียนด้วย C, Zig, Rust, แอสเซมบลี
- การออกแบบแบบ non-blocking ทำให้โค้ดที่ทำงานผิดปกติไม่ทำให้โฮสต์หยุดทำงาน
- ไม่สมมติให้โฮสต์มี I/O, มีโมเดลการรันที่เรียบง่ายและสม่ำเสมอ
- มี FFI ขนาดเล็กที่ปลอดภัย
- รันได้ตั้งแต่ สคริปต์ขนาดเล็ก ไปจนถึง แอปพลิเคชันที่ซับซ้อน
- ออกแบบโดยให้ความปลอดภัยมาก่อน, ข้อผิดพลาดภายใน VM จะไม่ทำให้โฮสต์เสียหาย
- แม้จะอิงกับ CPU emulator แบบสมบูรณ์ แต่ ไม่ได้มีเป้าหมายเพื่อการจำลองฮาร์ดแวร์
เปรียบเทียบกับทางเลือกอื่น
- มี memory footprint เล็กกว่า embedded scripting engine แบบเดิม
- รองรับภาษาที่ใช้อย่างแพร่หลาย เช่น C, Rust, Zig
- ผสานรวมกับซอฟต์แวร์เดิมได้ง่าย
- รองรับแนวทางที่หลากหลาย เช่น event-based·polling·multiprocessor
- มี ความทนทานต่อโค้ด VM ที่ผิดปกติ
- อย่างไรก็ตาม ไม่ได้มุ่งเป้าไปที่ การเรียก FFI โดยตรง, ประสิทธิภาพสูงสุด, ประสบการณ์ scripting ที่เรียบง่าย, หรือ ไลบรารีมาตรฐานในตัว
การ build และรัน (Docker)
- build ได้ด้วย C compiler เพียงอย่างเดียว และมีสภาพแวดล้อม Docker ให้
- สามารถตั้งค่าสภาพแวดล้อมได้ด้วยคำสั่ง
make dockerbuild, make dockershell
- ภายใน Docker shell ให้รัน
make แล้ว
สามารถรัน ./hosts/host/host apps/helloworld/helloworld.bin ได้
- สามารถดูตัวเลือกทั้งหมดได้ด้วยคำสั่ง
host -h
ใบอนุญาต
- ใช้ MIT License
- ใช้งานได้อย่างอิสระในงานวิจัย ผลิตภัณฑ์ และอุปกรณ์ embedded
3 ความคิดเห็น
ความเห็นจาก Hacker News
ลองดูโค้ดแล้ว โครงสร้าง กะทัดรัดมาก
ยังไม่ได้ลองคอมไพล์หรือรันเอง แต่รองรับส่วนขยายคำสั่ง RISC-V แบบ 32 บิตสำหรับ integer, multiplication และ atomic
การคำนวณ floating point ไม่ได้จำลองโดย emulator แต่ให้คอมไพเลอร์ (เช่น gcc) จำลองผ่านฟังก์ชันซอฟต์แวร์
คิดว่าเป็น การออกแบบที่ฉลาดมาก ตรงที่รองรับคอมไพเลอร์หลายตัว
โปรเจ็กต์ต้นทางที่ใช้เป็นฐานในการทำชุดคำสั่งจริงคือ mini-rv32ima
ดูเหมือนโปรเจ็กต์นี้จะอยู่ในพื้นที่ใกล้เคียงกับความพยายามสร้าง สภาพแวดล้อมรันไทม์ร่วม แบบ WASM
เพียงแต่ฐานเป็น RISC-V
อยากรู้ข้อจำกัดและข้อดีของแต่ละแนวทางให้มากกว่านี้ แต่ไม่ว่าอย่างไร ก็ดูเหมือนเรากำลังมุ่งไปสู่อนาคตที่แอปพลิเคชันทำงานบน VM กลางร่วมกัน
คิดว่าเว็บสมัยใหม่คือตัวอย่างที่ใกล้เคียงที่สุด
libriscv ก็เป็นโปรเจ็กต์ที่เท่มากและน่าประทับใจ
ลิงก์ไปยังการสนทนาที่เกี่ยวข้องอยู่ที่นี่
แต่ RISC-V อาจไม่เหมาะกับการใช้งานลักษณะนี้ก็ได้
เช่น ถ้าต้องถอดรหัส immediate value ในซอฟต์แวร์จะช้า แต่ในฮาร์ดแวร์จะเร็ว
ถึงอย่างนั้น RISC-V ก็ยังเป็นเป้าหมายที่จัดให้เสถียรและเรียบง่ายได้
โค้ดสะอาดมากและชอบ โครงสร้างแบบไฟล์ C เดียว
วิธีใช้ Docker เพื่อรันตัวอย่างก็สะดวกมากสำหรับสภาพแวดล้อม embedded
test coverage ก็ดูดี และน่าสนใจที่จะได้เห็น metrics ต่าง ๆ
เวลาจะเพิ่มความสามารถด้าน scripting ให้กับอุปกรณ์การแพทย์ ก็ดูเหมือนจะมีข้อดีตรงที่ไม่ต้องนำโค้ดแกนหลักไปตรวจรับรองใหม่ทุกครั้ง
ถ้าเอาไปเทียบกับ WASM interpreter สำหรับ embedded อย่าง WASM Micro Runtime ก็น่าสนใจมาก
บน Cortex M4F มีขนาด 56.3K ซึ่งใหญ่กว่ามาก
น่าจะเป็นเพราะ WASM เป็น ชุดคำสั่งที่ซับซ้อนกว่า โปรไฟล์ RISC-V ขั้นต่ำ
แต่ WAMR มีส่วนขยายหลากหลาย เช่น GC, JIT, WASI, threads และการรองรับ debugger
มีการแนะนำตัวอย่าง ZigDoom พร้อมคำพูดว่า “Just add rats”
จังหวะมาพอดีมาก
กำลังมองหา emulator แบบเบา ๆ สำหรับทดสอบเฟิร์มแวร์ embedded อยู่พอดี แต่ทางเลือกส่วนใหญ่หนักเกินไปหรือไม่เสถียร
ถ้ารองรับการจำลอง memory-mapped IO ได้ ก็น่าจะมีประโยชน์มากสำหรับการทดสอบไดรเวอร์ IoT หรือไมโครคอนโทรลเลอร์โดยไม่ต้องมีฮาร์ดแวร์จริง
ตัวแกนของ emulator รองรับ memory-mapped IO อยู่แล้ว แต่ uvm32 ใช้มันเป็นเพียงบล็อก RAM เพิ่มเติมบนโฮสต์เท่านั้น (เช่น framebuffer หรือ heap แยก)
write trap จัดการได้ตรงนี้ และ read trap จัดการได้ตรงนี้
ไม่รู้จริง ๆ ว่าเรื่องฟิชชิงอะไรนั่นไปโผล่มาจากคอมเมนต์ไหนกันแน่
คอมเมนต์นั้นถูกปักธงว่าเป็นสแปมเลยหายไป เหลือแค่คอมเมนต์ตอบกลับไว้ เลยดูแปลก ๆ น่ะครับ เดี๋ยวผมลบออกไว้ให้ครับ