- 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
La configuration CORS est incorrecte, donc pour que cela fonctionne correctement, il faut accéder à
https://bellard.org/jslinux/et non au lienhttps://www.bellard.org/jslinux/.