4 Punkte von GN⁺ 2025-04-15 | 1 Kommentare | Auf WhatsApp teilen
  • 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

 
ndrgrd 2025-04-16

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.