En la lista de difusión de desarrolladores del núcleo de Linux se han publicado parches con la implementación de la arquitectura "Wasm" para el núcleo de Linux, lo que permite compilar el núcleo en código intermedio WebAssembly para su ejecución directa en un navegador web sin la necesidad de emuladores. Además, se ha implementado en el núcleo de Linux la posibilidad de ejecutar archivos ejecutables en formato ".wasm" y se ha preparado un controlador "web console" para simular el uso de la consola en el navegador. También se ha creado un conjunto de herramientas para simplificar la construcción de entornos de sistema ejecutables en el navegador.
Como ejemplo, se ha formado un entorno basado en las utilidades BusyBox compiladas en WebAssembly y en la biblioteca del sistema musl. Xterm.js se ha utilizado como emulador de terminal para trabajar con este tipo de entorno. Se ha lanzado un sitio de demostración por separado, que permite evaluar el funcionamiento del puerto sin necesidad de compilar por sí mismo. Se ha anunciado soporte total para navegadores en el motor Chromium y soporte parcial para Firefox, donde las capacidades de depuración están limitadas. En computadoras modernas, la carga de la compilación de Wasm en el navegador toma menos de un segundo.
El proyecto ha estado en desarrollo durante aproximadamente dos años y en la etapa actual permite cargar el núcleo en los navegadores y ejecutar programas típicos. El trabajo aún no se ha completado y el puerto tiene problemas y limitaciones específicas. Por ejemplo, aún no se ha implementado el soporte para llamadas vfork y longjmp (se han aplicado parches a BusyBox para operar sin ellas), no existe la posibilidad de interrumpir tareas, el MMU no está disponible (el núcleo y los procesos operan en un solo espacio de direcciones), no es posible modificar el código ya cargado y la consola tiende a congelarse después de aproximadamente 5 minutos debido a problemas con el temporizador. Se señala que las limitaciones existentes son superables, pero para algunas de ellas se requieren la implementación de extensiones adicionales en los navegadores para WebAssembly. Se ha propuesto implementar tales extensiones para el MMU y la suspensión de hilos.
La imposibilidad de pausar la ejecución de hilos en WebAssembly no es compatible con el funcionamiento del planificador de tareas en el núcleo, pero se ha logrado implementar la multitarea de forma indirecta, vinculando cada hilo/tarea a su propio CPU virtual, gestionado en un Web Worker separado. De esta manera, se ha conseguido lograr la ejecución paralela de procesos gracias al motor del navegador y al núcleo del sistema operativo host, sin necesidad de utilizar multitarea por desplazamiento o cambio de tareas en el núcleo ejecutándose en el navegador. Las interrupciones y señales no funcionan plenamente en este esquema, y un CPU virtual separado se utiliza para la entrega de interrupciones por temporizador e IPI (Inter-Processor Interrupt).
El alcance del proyecto va más allá de simplemente ejecutar entornos Linux en navegadores. Por ejemplo, el puerto puede ser utilizado para crear programas WebAssembly multiplataforma que utilicen llamadas al sistema específicas de Linux. La implementación de tales llamadas al sistema puede ser transformada de forma independiente a WebAssembly y adjuntada a la aplicación, permitiendo su uso sin hacer depender del núcleo del sistema. El puerto también será útil para organizar la ejecución aislada de aplicaciones mediante WASI (Interfaz del Sistema WebAssembly).
Entre los planes se mencionan experimentos para implementar soporte gráfico en entornos con un núcleo construido en WebAssembly: sobre la base de la API del navegador WebGL se planea implementar EGL y garantizar el funcionamiento de OpenGL ES. También se prevé implementar soporte para el formato de depuración Dwarf para la depuración línea por línea del código.
Fuente: opennet.ru
