Na lista de discussão dos desenvolvedores do núcleo Linux, foram publicados patches contendo a implementação da arquitetura 'Wasm' para o núcleo Linux, permitindo compilar o núcleo em código intermediário WebAssembly para execução direta no navegador, sem necessidade de emuladores. Além disso, para o núcleo Linux, o projeto implementou a capacidade de executar arquivos no formato '.wasm' e preparou um driver de 'web console' para simular a interação com o console no navegador. Também foi preparado um conjunto de ferramentas para simplificar a montagem de ambientes de sistema executáveis no navegador.
Como exemplo, foi formado um ambiente baseado no conjunto de utilitários BusyBox compilados em WebAssembly e na biblioteca de sistema musl. O Xterm.js foi utilizado como emulador de terminal para trabalhar com esse ambiente. Um site de demonstração foi lançado separadamente, permitindo avaliar o funcionamento do porto sem a necessidade de compilar por conta própria. Há suporte total para navegadores baseados em Chromium e suporte parcial para Firefox, onde as funcionalidades de depuração são limitadas. Em computadores modernos, o carregamento da compilação do núcleo em Wasm no navegador leva menos de um segundo.
O projeto está em desenvolvimento há cerca de dois anos e, neste estágio, permite carregar o núcleo em navegadores e executar programas padrão. O trabalho ainda não está concluído e o porto apresenta problemas e limitações específicas. Por exemplo, ainda não foi implementado o suporte para chamadas vfork e longjmp (patches foram aplicados ao BusyBox para funcionar sem elas), não há possibilidade de interrupção de tarefas, o MMU não está disponível (o núcleo e os processos operam no mesmo espaço de endereçamento), não é possível alterar o código já carregado, e a console fica travada após cerca de 5 minutos devido a problemas com o temporizador. É observado que as limitações existentes são superáveis, mas para algumas delas é necessária a implementação de extensões adicionais ao WebAssembly nos navegadores. Extensões semelhantes foram propostas para o MMU e para a pausa das threads.
A impossibilidade de pausar a execução de threads em WebAssembly não se combina com o funcionamento do escalonador de tarefas no núcleo, mas a multitarefa foi implementada de forma alternativa, vinculando cada thread/tarefa a seu próprio CPU virtual, processado em um Web Worker separado. Dessa forma, foi possível alcançar a execução paralela de processos graças ao mecanismo do navegador e ao núcleo do sistema operacional host, sem o uso de multitarefa preemptiva e troca de tarefas no núcleo executado no navegador. Interrupções e sinais não funcionam plenamente nesse esquema, e um CPU virtual separado é utilizado para a entrega de interrupções do temporizador e IPI (Inter-Processor Interrupt).
O escopo do projeto vai além do simples lançamento de ambientes Linux em navegadores. Por exemplo, a porta pode ser usada para criar programas WebAssembly multiplataforma que utilizam chamadas de sistema específicas do Linux. A implementação de tais chamadas de sistema pode ser convertida separadamente em WebAssembly e anexada ao aplicativo, permitindo seu uso sem estar vinculado ao núcleo do sistema. A porta também será útil para organizar a execução isolada de aplicativos por meio do WASI (WebAssembly System Interface).
Dos planos, mencionam-se experimentos com a implementação de suporte gráfico em ambientes com um núcleo compilado em WebAssembly — com base na API do navegador WebGL, eles planejam implementar EGL e garantir o funcionamento do OpenGL ES. Também está previsto implementar suporte ao formato de depuração Dwarf para depuração passo a passo do código.
Fonte: opennet.ru
