4 points par GN⁺ 2025-04-15 | 1 commentaires | Partager sur WhatsApp
  • Un émulateur de PC en JavaScript/WASM capable d’exécuter Linux et Windows NT dans le navigateur, un projet lancé par Fabrice Bellard en 2011 comme premier émulateur x86 en JS et développé continuellement depuis
  • Le code C basé sur TinyEMU est compilé avec emscripten, et des périphériques VirtIO sont utilisés pour prendre en charge le système de fichiers, le réseau et les périphériques bloc
  • L’émulation de CPU x86 64 bits est très aboutie, avec prise en charge d’extensions récentes comme AVX-512, APX
  • Prend aussi en charge l’émulation de CPU RISC-V 32/64 bits, avec exécution possible de diverses distributions comme Alpine Linux, Buildroot
  • Dispose de cas d’usage concrets tels que le benchmarking de moteurs JavaScript, l’apprentissage d’Unix dans le navigateur et l’exécution de logiciels PC legacy

Historique

  • La première version, en 2011, était le premier émulateur PC/x86 écrit en JavaScript, en réutilisant les helpers x86 et le code des périphériques de QEMU
  • En 2015, l’adoption du sous-ensemble asm.js a permis des gains de vitesse dans les navigateurs compatibles
  • En 2016, après avoir écrit TinyEMU, un émulateur RISC-V, le code C a été converti en JavaScript avec emscripten
    • Ajout d’un système de fichiers VirtIO 9P inspiré de jor1k (Sebastian Macke), facilitant l’accès à un système de fichiers distant ainsi que l’import/export de fichiers
  • Pour réutiliser les périphériques VirtIO dans l’émulateur x86 en JS, le code asm.js de JSLinux a été converti en C puis reconverti en JavaScript avec emscripten
    • Grâce à un réglage fin, cela a permis d’obtenir des performances supérieures à la version asm.js écrite à la main
  • Pour exécuter Windows NT, la méthode initiale consistait à faire tourner QEMU en imbriqué à l’intérieur du Linux émulé
    • Comme l’émulateur x86 prend en charge l’extension de virtualisation AMD SVM, cette exécution imbriquée restait utilisable
  • La version actuelle émule directement les périphériques PC manquants comme le clavier/souris PS/2, le disque IDE et un VGA minimal, afin d’exécuter Windows NT nativement

Émulation du CPU x86

  • Émulation de CPU x86, avec prise en charge des fonctions suivantes :
    • CPU de classe Pentium
    • x87 en virgule flottante 80 bits (bit exact)
    • PAE
    • Instructions CMOV
    • Prise en charge de MMX et SSE2
    • Extension de machine virtuelle AMD SVM (avec prise en charge de Nested Page Table)
    • Lecture du compteur d’instructions via RDPMC
  • Limitations connues :
    • Pas de vérification des limites de segment ni des permissions lors des accès mémoire
    • Pas de prise en charge du débogage (registres DRx)

Périphériques émulés

  • 8259 PIC (Programmable Interrupt Controller)
  • 8254 PIT (Programmable Interrupt Timer)
  • 16450 UART (débogage uniquement)
  • Horloge temps réel
  • Bus PCI
  • Console VirtIO, système de fichiers 9P, réseau, périphériques bloc et entrée
  • Framebuffer simple
  • Contrôleur IDE, clavier/souris PS/2, affichage VGA minimal (tous optionnels)

Émulation du CPU RISC-V

  • Émulation de CPU RISC-V 32 ou 64 bits, avec prise en charge du FPU 64 bits et des instructions compressées (compressed instructions)
  • Fournit actuellement des distributions Buildroot et Fedora en RISC-V 64 bits
  • Les images RISC-V 32 bits restent disponibles, mais ne sont plus activement maintenues
    • Versions console et X Window de buildroot-riscv32 disponibles

Performances

  • En 2017, sur un PC de bureau standard avec Firefox, l’émulateur x86 tournait à environ 100 MIPS
  • L’utilitaire intégré vmtime permet d’effectuer des benchmarks détaillés

Terminal JavaScript

  • Version améliorée du terminal JSLinux d’origine, avec prise en charge de la barre de défilement et de la mise en évidence des URL

Distributions Linux

  • Utilise les distributions Alpine Linux et Buildroot
  • Ajout de packages personnalisés comme vfsync, qemacs et tcc
  • Prise en charge optionnelle de X Window via le gestionnaire de fenêtres Fluxbox

Réseau

  • Accès à Internet possible depuis l’intérieur de l’émulateur
  • Utilise le VPN websocket fourni par Benjamin Burns
  • Bande passante limitée à 40 kB/s, avec un maximum de 2 connexions par IP publique

Usages

  • Benchmarking de moteurs JavaScript (par exemple, mesurer le temps de démarrage de Linux) et exploitation de nouvelles technologies navigateur comme asm.js et WASM
  • Apprentissage des outils Unix en ligne de commande sans quitter le navigateur
  • Accès sécurisé aux fichiers dans le navigateur (vfsync)
  • Exécution de logiciels PC legacy

Code source et projets similaires

  • Le code source de la version RISC-V est fourni via le projet TinyEMU, qui propose aussi des démos précompilées faciles à installer
  • Projets similaires :
    • jor1k : émulateur de CPU OpenRISC OR1K
    • v86 : émulateur de PC
    • angel : émulateur de CPU RISC-V

1 commentaires

 
ndrgrd 2025-04-16

La configuration CORS est incorrecte, donc pour que cela fonctionne correctement, il faut accéder à https://bellard.org/jslinux/ et non au lien https://www.bellard.org/jslinux/.