- Emulador de PC basado en JavaScript/WASM que permite ejecutar Linux y Windows NT en el navegador; es un proyecto que Fabrice Bellard inició en 2011 como el primer emulador x86 en JS y que ha seguido desarrollando hasta hoy
- Compila código C basado en TinyEMU con emscripten y usa dispositivos VirtIO para dar soporte a sistema de archivos, red y dispositivos de bloque
- La emulación de CPU x86 de 64 bits tiene un alto nivel de madurez e incluye extensiones modernas como AVX-512, APX
- También soporta emulación de CPU RISC-V de 32/64 bits, y puede ejecutar varias distribuciones como Alpine Linux, Buildroot
- Tiene casos de uso prácticos como benchmarking del rendimiento del motor de JavaScript, aprendizaje de Unix dentro del navegador y ejecución de software legado de PC
Historia
- La primera versión de 2011 fue el primer emulador de PC/x86 escrito en JavaScript, reutilizando helpers x86 y código de dispositivos de QEMU
- En 2015 adoptó el subconjunto asm.js, logrando mejoras de velocidad en navegadores compatibles
- En 2016, tras crear TinyEMU, un emulador RISC-V, convirtió código C a JavaScript con emscripten
- Añadió el sistema de archivos VirtIO 9P, inspirado en jor1k (Sebastian Macke), para facilitar el acceso a sistemas de archivos remotos y la importación/exportación de archivos
- Para reutilizar los dispositivos VirtIO también en el emulador x86 en JS, pasó por el proceso de convertir el código asm.js de JSLinux a C y luego recompilarlo con emscripten a JavaScript
- Con ajustes finos, logró mejor rendimiento que la versión asm.js hecha manualmente
- Para ejecutar Windows NT, al principio utilizó un método de ejecutar QEMU de forma anidada dentro del Linux emulado
- Como el emulador x86 soporta la extensión de virtualización AMD SVM, el modo anidado era suficientemente usable
- La versión actual emula directamente los dispositivos de PC faltantes como teclado/mouse PS/2, disco IDE y VGA dummy, para ejecutar Windows NT de forma nativa
Emulación de CPU x86
- Emulación de CPU x86 con soporte para las siguientes funciones:
- CPU de clase Pentium
- x87 de punto flotante de 80 bits (bit exact)
- PAE
- Instrucciones CMOV
- Soporte para MMX y SSE2
- Extensión de máquina virtual AMD SVM (con soporte para Nested Page Table)
- Lectura del conteo de instrucciones mediante RDPMC
- Limitaciones conocidas:
- No realiza verificación de límites de segmento ni de permisos al acceder a memoria
- Sin soporte de depuración (registros DRx)
Dispositivos emulados
- 8259 PIC (Programmable Interrupt Controller)
- 8254 PIT (Programmable Interrupt Timer)
- 16450 UART (solo para depuración)
- Real Time Clock
- Bus PCI
- Consola VirtIO, sistema de archivos 9P, red, dispositivo de bloque y entrada
- Simple framebuffer
- Controlador IDE, teclado/mouse PS/2 y pantalla VGA dummy (todos opcionales)
Emulación de CPU RISC-V
- Emulación de CPU RISC-V de 32 o 64 bits, con soporte para FPU de 64 bits e instrucciones comprimidas (compressed instructions)
- Actualmente ofrece distribuciones RISC-V de 64 bits de Buildroot y Fedora
- Las imágenes RISC-V de 32 bits siguen disponibles, pero ya no reciben mantenimiento activo
- Se ofrecen versiones de consola y X Window de buildroot-riscv32
Rendimiento
- En 2017, usando Firefox en una PC de escritorio común, el emulador x86 corría a alrededor de 100 MIPS
- Se puede realizar benchmarking detallado con la utilidad integrada
vmtime
Terminal de JavaScript
- Es una versión mejorada del terminal original de JSLinux, con soporte para barra de desplazamiento y resaltado de URL
Distribuciones Linux
- Usa las distribuciones Alpine Linux y Buildroot
- Añade paquetes personalizados como vfsync, qemacs y tcc
- Soporte opcional de X Window mediante el gestor de ventanas Fluxbox
Redes
- Es posible acceder a Internet desde dentro del emulador
- Usa el VPN por websocket proporcionado por Benjamin Burns
- Ancho de banda limitado a 40 kB/s, con un máximo de 2 conexiones por IP pública permitidas
Usos
- Benchmarking de motores de JavaScript (por ejemplo, medir el tiempo de arranque de Linux) y aprovechamiento de nuevas tecnologías de navegador como asm.js y WASM
- Aprender herramientas Unix de línea de comandos sin salir del navegador
- Acceso seguro a archivos dentro del navegador (vfsync)
- Ejecución de software legado de PC
Código fuente y proyectos similares
- El código fuente de la versión RISC-V se ofrece en el proyecto TinyEMU, que también ofrece demos precompilados fáciles de instalar
- Proyectos similares:
- jor1k: emulador de CPU OpenRISC OR1K
- v86: emulador de PC
- angel: emulador de CPU RISC-V
1 comentarios
La configuración de CORS está mal, así que para que funcione correctamente hay que entrar a https://bellard.org/jslinux/ en lugar del enlace https://www.bellard.org/jslinux/ .