- โปรแกรมจำลองพีซีบนพื้นฐาน JavaScript/WASM ที่สามารถรัน Linux และ Windows NT ได้ในเบราว์เซอร์ เป็นโปรเจ็กต์ที่ Fabrice Bellard เริ่มต้นขึ้นในปี 2011 ในฐานะโปรแกรมจำลอง x86 แบบ JS ตัวแรก และพัฒนาต่อเนื่องมาจนถึงปัจจุบัน
- คอมไพล์โค้ด C ที่อิง TinyEMU ด้วย emscripten และรองรับระบบไฟล์, เครือข่าย และบล็อกดีไวซ์ผ่านอุปกรณ์ VirtIO
- การจำลอง CPU x86 แบบ 64 บิตมีความสมบูรณ์สูง โดยรองรับชุดคำสั่งขยายสมัยใหม่อย่าง AVX-512, APX ด้วย
- รองรับการจำลอง CPU RISC-V แบบ 32/64 บิต และสามารถรันดิสโทรหลากหลายแบบ เช่น Alpine Linux, Buildroot
- มี กรณีการใช้งานจริง เช่น การทำเบนช์มาร์กประสิทธิภาพของ JavaScript engine, การเรียนรู้ Unix ในเบราว์เซอร์, และการรันซอฟต์แวร์พีซีรุ่นเก่า
ประวัติ
- เวอร์ชันแรกในปี 2011 เป็น โปรแกรมจำลอง PC/x86 ตัวแรก ที่เขียนด้วย JavaScript โดยนำ x86 helper และโค้ดอุปกรณ์ของ QEMU กลับมาใช้
- ในปี 2015 มีการใช้ซับเซ็ต asm.js เพื่อเพิ่มความเร็วในเบราว์เซอร์ที่รองรับ
- ในปี 2016 หลังจากสร้าง TinyEMU ซึ่งเป็นโปรแกรมจำลอง RISC-V แล้ว จึงแปลงโค้ด C เป็น JavaScript ด้วย emscripten
- เพิ่ม ระบบไฟล์ VirtIO 9P ที่ได้แรงบันดาลใจจาก jor1k(Sebastian Macke) เพื่อให้เข้าถึงระบบไฟล์ระยะไกลและ import/export ไฟล์ได้ง่าย
- เพื่อให้นำอุปกรณ์ VirtIO กลับมาใช้กับโปรแกรมจำลอง x86 แบบ JS ได้อีกครั้ง จึงผ่านกระบวนการ แปลงโค้ด JSLinux asm.js เป็น C แล้วแปลงกลับเป็น JavaScript ด้วย emscripten
- ด้วยการปรับแต่งอย่างละเอียด ทำให้ได้ ประสิทธิภาพที่เร็วกว่ารุ่น asm.js ที่เขียนด้วยมือ
- ในช่วงแรก การรัน Windows NT ใช้วิธี รัน QEMU ซ้อน อยู่ภายใน Linux ที่ถูกจำลอง
- เนื่องจากโปรแกรมจำลอง x86 รองรับส่วนขยาย virtualization AMD SVM จึงยังใช้งานได้ในระดับที่ดีแม้จะเป็นการรันซ้อน
- เวอร์ชันปัจจุบันสามารถรัน Windows NT ได้แบบเนทีฟ โดย จำลองอุปกรณ์พีซีที่ขาดหายไปด้วยตนเอง เช่น PS/2 keyboard/mouse, IDE disk และ dummy VGA
การจำลอง CPU x86
- การจำลอง x86 CPU รองรับความสามารถต่อไปนี้:
- CPU ระดับ Pentium
- x87 เลขทศนิยมลอยตัว 80 บิตแบบ bit exact
- PAE
- คำสั่ง CMOV
- รองรับ MMX, SSE2
- ส่วนขยาย virtual machine ของ AMD SVM (รองรับ Nested Page Table)
- อ่านจำนวนคำสั่งผ่าน RDPMC
- ข้อจำกัดที่ทราบ:
- ไม่มี การตรวจสอบ segment limit และสิทธิ์การเข้าถึง ระหว่างการเข้าถึงหน่วยความจำ
- ไม่รองรับการดีบัก (รีจิสเตอร์ DRx)
อุปกรณ์ที่จำลอง
- 8259 PIC(Programmable Interrupt Controller)
- 8254 PIT(Programmable Interrupt Timer)
- 16450 UART(สำหรับดีบักเท่านั้น)
- Real Time Clock
- PCI bus
- VirtIO console, ระบบไฟล์ 9P, เครือข่าย, บล็อกดีไวซ์, อินพุต
- Simple framebuffer
- IDE controller, PS/2 keyboard/mouse, dummy VGA display (ทั้งหมดเป็นตัวเลือก)
การจำลอง CPU RISC-V
- การจำลอง RISC-V CPU แบบ 32 บิตหรือ 64 บิต รองรับ FPU 64 บิต และ compressed instructions
- ปัจจุบันมีดิสโทร RISC-V 64 บิตแบบ Buildroot และ Fedora ให้ใช้งาน
- อิมเมจ RISC-V 32 บิตยังคงใช้งานได้ แต่ ไม่ได้รับการดูแลเชิงรุกอีกต่อไป
- มีทั้งเวอร์ชันคอนโซลและเวอร์ชัน X Window ของ buildroot-riscv32
ประสิทธิภาพ
- ณ ปี 2017 เมื่อใช้เบราว์เซอร์ Firefox บนเดสก์ท็อปพีซีทั่วไป โปรแกรมจำลอง x86 ทำงานได้ราว 100 MIPS
- สามารถทำ เบนช์มาร์กแบบละเอียด ได้ผ่านยูทิลิตี
vmtime ที่มีมาให้
JavaScript terminal
- เป็นเวอร์ชันปรับปรุงของเทอร์มินัล JSLinux ดั้งเดิม โดยรองรับ scrollbar และ URL highlighting
Linux ดิสโทร
- ใช้ดิสโทร Alpine Linux และ Buildroot
- เพิ่ม แพ็กเกจแบบกำหนดเอง เช่น vfsync, qemacs, tcc
- รองรับ X Window แบบเลือกใช้ผ่าน window manager Fluxbox
เครือข่าย
- เข้าถึงอินเทอร์เน็ตได้ จากภายในโปรแกรมจำลอง
- ใช้ websocket VPN ที่ให้บริการโดย Benjamin Burns
- จำกัดแบนด์วิดท์ที่ 40 kB/s และอนุญาตสูงสุด 2 การเชื่อมต่อ ต่อ public IP
การใช้งาน
- ใช้ทำ เบนช์มาร์ก JavaScript engine (เช่น วัดเวลาที่ใช้ในการบูต Linux) และใช้ประโยชน์จากเทคโนโลยีเบราว์เซอร์ใหม่อย่าง asm.js, WASM
- เรียนรู้ เครื่องมือ Unix แบบ command line ได้โดยไม่ต้องออกจากเบราว์เซอร์
- เข้าถึงไฟล์อย่างปลอดภัย ภายในเบราว์เซอร์ (vfsync)
- รัน ซอฟต์แวร์พีซีแบบเลกาซี
ซอร์สโค้ดและโปรเจ็กต์ที่คล้ายกัน
- ซอร์สโค้ดของเวอร์ชัน RISC-V มีให้ในโปรเจ็กต์ TinyEMU พร้อมเดโมแบบคอมไพล์ล่วงหน้าที่ติดตั้งใช้งานได้ง่าย
- โปรเจ็กต์ที่คล้ายกัน:
- jor1k: โปรแกรมจำลอง CPU OpenRISC OR1K
- v86: โปรแกรมจำลองพีซี
- angel: โปรแกรมจำลอง CPU RISC-V
1 ความคิดเห็น
ตั้งค่า CORS ผิด เลยต้องเข้า https://bellard.org/jslinux/ แทน https://www.bellard.org/jslinux/ ในลิงก์ ถึงจะใช้งานได้ตามปกติครับ