4 puntos por GN⁺ 2025-04-15 | 1 comentarios | Compartir por WhatsApp
  • 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

 
ndrgrd 2025-04-16

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/ .