4 pontos por GN⁺ 2025-04-15 | 1 comentários | Compartilhar no WhatsApp
  • Emulador de PC baseado em JavaScript/WASM capaz de executar Linux e Windows NT no navegador; é um projeto desenvolvido por Fabrice Bellard desde 2011, quando começou como o primeiro emulador x86 em JS
  • Compila código C baseado no TinyEMU com emscripten e usa dispositivos VirtIO para oferecer suporte a sistema de arquivos, rede e dispositivos de bloco
  • A emulação de CPU x86 de 64 bits tem alto grau de maturidade, incluindo extensões modernas como AVX-512, APX e outras
  • Também oferece suporte à emulação de CPU RISC-V de 32/64 bits, permitindo executar várias distribuições como Alpine Linux e Buildroot
  • Possui casos de uso práticos, como benchmarking de desempenho de engines JavaScript, aprendizado de Unix no navegador e execução de software legado de PC

História

  • A primeira versão, em 2011, foi o primeiro emulador de PC/x86 escrito em JavaScript, reutilizando helpers x86 e código de dispositivos do QEMU
  • Em 2015, adotou o subconjunto asm.js, obtendo ganho de velocidade em navegadores compatíveis
  • Em 2016, após criar o emulador RISC-V TinyEMU, o código C foi convertido para JavaScript com emscripten
    • Foi adicionado o sistema de arquivos VirtIO 9P, inspirado no jor1k (Sebastian Macke), facilitando acesso remoto ao sistema de arquivos e importação/exportação de arquivos
  • Para reutilizar dispositivos VirtIO também no emulador x86 em JS, o código asm.js do JSLinux passou por um processo de conversão para C e depois recompilação para JavaScript com emscripten
    • Com ajustes finos, foi alcançado um desempenho superior ao da versão asm.js feita manualmente
  • Para executar o Windows NT, no início foi usado o método de executar QEMU de forma aninhada dentro do Linux emulado
    • Como o emulador x86 suporta a extensão de virtualização AMD SVM, o uso aninhado ainda era viável
  • A versão atual executa o Windows NT nativamente ao emular diretamente os dispositivos de PC ausentes, como teclado/mouse PS/2, disco IDE e VGA dummy

Emulação de CPU x86

  • Emulação de CPU x86, com suporte aos seguintes recursos:
    • CPU classe Pentium
    • x87 de ponto flutuante de 80 bits (bit exact)
    • PAE
    • Instruções CMOV
    • Suporte a MMX e SSE2
    • Extensão de máquina virtual AMD SVM (com suporte a Nested Page Table)
    • Leitura de contagem de instruções via RDPMC
  • Limitações conhecidas:
    • Não realiza verificação de limites de segmento nem de permissões em acessos à memória
    • Sem suporte a depuração (registradores DRx)

Dispositivos emulados

  • 8259 PIC (Programmable Interrupt Controller)
  • 8254 PIT (Programmable Interrupt Timer)
  • 16450 UART (somente para depuração)
  • Relógio de tempo real
  • Barramento PCI
  • Console VirtIO, sistema de arquivos 9P, rede, dispositivo de bloco e entrada
  • Simple framebuffer
  • Controlador IDE, teclado/mouse PS/2 e tela VGA dummy (todos opcionais)

Emulação de CPU RISC-V

  • Emulação de CPU RISC-V de 32 ou 64 bits, com suporte a FPU de 64 bits e instruções compactadas (compressed instructions)
  • Atualmente fornece distribuições RISC-V de 64 bits do Buildroot e Fedora
  • Imagens RISC-V de 32 bits ainda podem ser usadas, mas não são mais mantidas ativamente
    • Há versões de console e de X Window do buildroot-riscv32

Desempenho

  • Em 2017, em um PC desktop comum com Firefox, o emulador x86 rodava a cerca de 100 MIPS
  • É possível executar benchmarks detalhados com o utilitário interno vmtime

Terminal JavaScript

  • Versão aprimorada do terminal original do JSLinux, com suporte a barra de rolagem e realce de URL

Distribuições Linux

  • Usa as distribuições Alpine Linux e Buildroot
  • Adiciona pacotes personalizados como vfsync, qemacs e tcc
  • Suporte opcional a X Window via gerenciador de janelas Fluxbox

Rede

  • É possível acessar a internet de dentro do emulador
  • Usa a websocket VPN fornecida por Benjamin Burns
  • Largura de banda limitada a 40 kB/s, com no máximo 2 conexões por IP público

Usos

  • Benchmarking de engines JavaScript (por exemplo, medir o tempo de boot do Linux) e uso de novas tecnologias de navegador como asm.js e WASM
  • Aprender ferramentas Unix de linha de comando sem sair do navegador
  • Acesso seguro a arquivos no navegador (vfsync)
  • Execução de software legado de PC

Código-fonte e projetos semelhantes

  • O código-fonte da versão RISC-V é fornecido no projeto TinyEMU, que também oferece demos pré-compiladas fáceis de instalar
  • Projetos semelhantes:
    • jor1k: emulador de CPU OpenRISC OR1K
    • v86: emulador de PC
    • angel: emulador de CPU RISC-V

1 comentários

 
ndrgrd 2025-04-16

A configuração de CORS está incorreta, então para funcionar normalmente é preciso acessar https://bellard.org/jslinux/ em vez do link https://www.bellard.org/jslinux/.