11 คะแนน โดย GN⁺ 2025-12-15 | 3 ความคิดเห็น | แชร์ทาง WhatsApp
  • 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 ความคิดเห็น

 
GN⁺ 2025-12-15
ความเห็นจาก Hacker News
  • ลองดูโค้ดแล้ว โครงสร้าง กะทัดรัดมาก
    ยังไม่ได้ลองคอมไพล์หรือรันเอง แต่รองรับส่วนขยายคำสั่ง RISC-V แบบ 32 บิตสำหรับ integer, multiplication และ atomic
    การคำนวณ floating point ไม่ได้จำลองโดย emulator แต่ให้คอมไพเลอร์ (เช่น gcc) จำลองผ่านฟังก์ชันซอฟต์แวร์
    คิดว่าเป็น การออกแบบที่ฉลาดมาก ตรงที่รองรับคอมไพเลอร์หลายตัว
    โปรเจ็กต์ต้นทางที่ใช้เป็นฐานในการทำชุดคำสั่งจริงคือ mini-rv32ima

  • ดูเหมือนโปรเจ็กต์นี้จะอยู่ในพื้นที่ใกล้เคียงกับความพยายามสร้าง สภาพแวดล้อมรันไทม์ร่วม แบบ WASM
    เพียงแต่ฐานเป็น RISC-V
    อยากรู้ข้อจำกัดและข้อดีของแต่ละแนวทางให้มากกว่านี้ แต่ไม่ว่าอย่างไร ก็ดูเหมือนเรากำลังมุ่งไปสู่อนาคตที่แอปพลิเคชันทำงานบน VM กลางร่วมกัน
    คิดว่าเว็บสมัยใหม่คือตัวอย่างที่ใกล้เคียงที่สุด

    • ก่อนหน้านี้เคยลองเทียบ WASM กับ libriscv แบบคร่าว ๆ แล้วเลือก WASM เพราะ ความเข้ากันได้กับเบราว์เซอร์
      libriscv ก็เป็นโปรเจ็กต์ที่เท่มากและน่าประทับใจ
      ลิงก์ไปยังการสนทนาที่เกี่ยวข้องอยู่ที่นี่
    • ดูจากบทความ Wasefire บน Google Open Source Blog แล้ว ขนาดโค้ดน่าจะเล็กกว่า
      แต่ 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 ขั้นต่ำ

  • มีการแนะนำตัวอย่าง ZigDoom พร้อมคำพูดว่า “Just add rats”

  • จังหวะมาพอดีมาก
    กำลังมองหา emulator แบบเบา ๆ สำหรับทดสอบเฟิร์มแวร์ embedded อยู่พอดี แต่ทางเลือกส่วนใหญ่หนักเกินไปหรือไม่เสถียร
    ถ้ารองรับการจำลอง memory-mapped IO ได้ ก็น่าจะมีประโยชน์มากสำหรับการทดสอบไดรเวอร์ IoT หรือไมโครคอนโทรลเลอร์โดยไม่ต้องมีฮาร์ดแวร์จริง

    • อันนี้ทำได้ไม่ยาก
      ตัวแกนของ emulator รองรับ memory-mapped IO อยู่แล้ว แต่ uvm32 ใช้มันเป็นเพียงบล็อก RAM เพิ่มเติมบนโฮสต์เท่านั้น (เช่น framebuffer หรือ heap แยก)
      write trap จัดการได้ตรงนี้ และ read trap จัดการได้ตรงนี้
 
balthasar 2025-12-15

ไม่รู้จริง ๆ ว่าเรื่องฟิชชิงอะไรนั่นไปโผล่มาจากคอมเมนต์ไหนกันแน่

 
xguru 2025-12-15

คอมเมนต์นั้นถูกปักธงว่าเป็นสแปมเลยหายไป เหลือแค่คอมเมนต์ตอบกลับไว้ เลยดูแปลก ๆ น่ะครับ เดี๋ยวผมลบออกไว้ให้ครับ