- Ein JavaScript/WASM-basierter PC-Emulator, mit dem sich Linux und Windows NT im Browser ausführen lassen; das Projekt wurde 2011 von Fabrice Bellard als erster x86-JS-Emulator gestartet und wird bis heute weiterentwickelt
- Kompiliert TinyEMU-basierten C-Code mit emscripten und unterstützt über VirtIO-Geräte Dateisystem, Netzwerk und Blockgeräte
- Die x86-64-Bit-CPU-Emulation ist hoch ausgereift und umfasst selbst aktuelle Erweiterungsbefehlssätze wie AVX-512, APX
- Unterstützt auch RISC-V-32/64-Bit-CPU-Emulation; verschiedene Distributionen wie Alpine Linux, Buildroot können ausgeführt werden
- Verfügt über praktische Einsatzszenarien wie Performance-Benchmarking von JavaScript-Engines, Unix-Lernen im Browser und das Ausführen von Legacy-PC-Software
Geschichte
- Die erste Version von 2011 war der erste PC/x86-Emulator, der in JavaScript geschrieben wurde, und nutzte x86-Helfer- und Gerätecode aus QEMU wieder
- 2015 wurde das asm.js-Subset angewendet, was in unterstützenden Browsern zu Geschwindigkeitsgewinnen führte
- 2016 wurde mit TinyEMU ein RISC-V-Emulator geschrieben; anschließend wurde der C-Code mit emscripten in JavaScript umgewandelt
- Es wurde ein von jor1k (Sebastian Macke) inspiriertes VirtIO-9P-Dateisystem ergänzt, wodurch der Zugriff auf entfernte Dateisysteme sowie Datei-Import/Export erleichtert wurde
- Um VirtIO-Geräte auch im x86-JS-Emulator wiederzuverwenden, wurde der JSLinux-asm.js-Code nach C konvertiert und anschließend mit emscripten erneut in JavaScript zurückübersetzt
- Durch feines Tuning wurde eine höhere Performance als bei der handgeschriebenen asm.js-Version erreicht
- Um Windows NT auszuführen, wurde anfangs QEMU verschachtelt innerhalb des emulierten Linux gestartet
- Da der x86-Emulator die Virtualisierungserweiterung AMD SVM unterstützt, war auch der verschachtelte Betrieb praktisch nutzbar
- Die aktuelle Version emuliert fehlende PC-Geräte direkt selbst, darunter PS/2-Tastatur/Maus, IDE-Festplatte und Dummy-VGA, sodass Windows NT nativ ausgeführt werden kann
x86-CPU-Emulation
- x86-CPU-Emulation mit Unterstützung für:
- CPU der Pentium-Klasse
- x87 80-Bit-Gleitkomma (bitgenau)
- PAE
- CMOV-Befehle
- Unterstützung für MMX, SSE2
- AMD SVM-Erweiterungen für virtuelle Maschinen (mit Nested Page Table-Unterstützung)
- Auslesen des Befehlszählers über RDPMC
- Bekannte Einschränkungen:
- Keine Segmentgrenzen- und Rechteprüfung bei Speicherzugriffen
- Kein Debug-Support (DRx-Register)
Emulierte Geräte
- 8259 PIC (Programmable Interrupt Controller)
- 8254 PIT (Programmable Interrupt Timer)
- 16450 UART (nur für Debugging)
- Echtzeituhr
- PCI-Bus
- VirtIO-Konsole, 9P-Dateisystem, Netzwerk, Blockgeräte, Eingabe
- Simple framebuffer
- IDE-Controller, PS/2-Tastatur/Maus, Dummy-VGA-Display (jeweils optional)
RISC-V-CPU-Emulation
- Emulation einer 32-Bit- oder 64-Bit-RISC-V-CPU mit Unterstützung für 64-Bit-FPU und komprimierte Befehle (compressed instructions)
- Derzeit werden RISC-V-64-Bit-Distributionen von Buildroot und Fedora bereitgestellt
- RISC-V-32-Bit-Images sind weiterhin verfügbar, werden jedoch nicht mehr aktiv gepflegt
- Verfügbar als buildroot-riscv32-Konsolenversion sowie X-Window-Version
Performance
- Stand 2017 lief der x86-Emulator in Firefox auf einem gewöhnlichen Desktop-PC mit etwa 100 MIPS
- Mit dem integrierten Dienstprogramm
vmtime lassen sich detaillierte Benchmarks durchführen
JavaScript-Terminal
- Eine verbesserte Version des ursprünglichen JSLinux-Terminals mit Unterstützung für Scrollbars und URL-Highlighting
Linux-Distributionen
- Verwendet Distributionen von Alpine Linux und Buildroot
- Ergänzt um benutzerdefinierte Pakete wie vfsync, qemacs und tcc
- Optionale X-Window-Unterstützung über den Fluxbox-Fenstermanager
Networking
- Internetzugang ist innerhalb des Emulators möglich
- Verwendet ein von Benjamin Burns bereitgestelltes websocket VPN
- Bandbreite auf 40 kB/s begrenzt, maximal 2 Verbindungen pro öffentlicher IP erlaubt
Anwendungsfälle
- Benchmarking von JavaScript-Engines (z. B. Messung der Linux-Bootzeit) sowie Nutzung neuer Browser-Technologien wie asm.js und WASM
- Lernen von Unix-Kommandozeilenwerkzeugen ohne den Browser zu verlassen
- Sicherer Dateizugriff im Browser (vfsync)
- Ausführung von Legacy-PC-Software
Quellcode und ähnliche Projekte
- Der Quellcode der RISC-V-Version wird im Projekt TinyEMU bereitgestellt; zudem gibt es vorcompilierte, leicht installierbare Demos
- Ähnliche Projekte:
- jor1k: OpenRISC-OR1K-CPU-Emulator
- v86: PC-Emulator
- angel: RISC-V-CPU-Emulator
1 Kommentare
Die CORS-Konfiguration ist fehlerhaft, daher funktioniert es nur korrekt, wenn man nicht den Link https://www.bellard.org/jslinux/, sondern https://bellard.org/jslinux/ aufruft.