В списке рассылки разработчиков ядра Linux представлены патчи с реализацией архитектуры Wasm для ядра Linux. Это решение позволяет компилировать ядро Linux в промежуточный код WebAssembly для последующего прямого выполнения в веб‑браузере без задействования эмуляторов.
Также для ядра Linux этим проектом реализована возможность запускать исполняемые файлы в формате «.wasm» и подготовлен драйвер web console для симуляции работы с консолью в браузере.
Дополнительно в рамках развития Wasm для Linux представлен инструментарий для упрощения сборки запускаемых в браузере системных окружений — проект Scripts for Building a Linux/Wasm Operating System на GitHub.
Для ознакомления сформировано окружение на базе скомпилированных в WebAssembly набора утилит BusyBox и системной библиотеки musl. В качестве эмулятора терминала для работы с подобным окружением задействован Xterm.js.
Отдельно разработчиками проекта представлен демонстрационный портал, позволяющий оценить работу порта Wasm для Linux без самостоятельно компиляции. Заявлена полная поддержка браузеров на движке Chromium и частичная поддержка Firefox, в котором ограничены возможности отладки. На современных компьютерах загрузка Wasm‑сборки ядра в браузере занимает менее секунды.
По информации OpenNET, проект Wasm для Linux развивается уже около двух лет и на текущем этапе позволяет загружать ядро в браузерах и выполнять типовые программы. Работа ещё не завершена и порт имеет отдельные пр��блемы и ограничения. Например, ещё не реализована поддержка вызовов vfork и longjmp (к BusyBox применены патчи для работы без них), отсутствует возможность прерывания задач, недоступен MMU (ядро и процессы работают в одном адресном пространстве), невозможно изменение уже загруженного кода, наблюдается зависание консоли примерно через 5 минут из‑за проблем с таймером. Отмечается, что имеющиеся ограничения преодолимы, но для некоторых из них требуется реализация в браузерах дополнительных расширений к WebAssembly. Подобные расширения предложено реализовать для MMU и приостановки потоков.
Невозможность приостановки выполнения потоков в WebAssembly не сочетается с работой планировщика задач в ядре, но многозадачность удалось реализовать обходным путём, через привязку каждого потока/задачи к своему виртуальному CPU, обрабатываемому в отдельном Web Worker. Таким способом удалось добиться параллельного выполнения процессов за счёт браузерного движка и ядра хостовой ОС без использования вытесняющей многозадачности и переключения задач в запускаемом в браузере ядре. Прерывания и сигналы при такой схеме полноценно не работают, а для доставки прерываний таймера и IPI (Inter‑Processor Interrupt) задействован отдельный виртуальный CPU.
Область применения проекта Wasm для Linux выходит за рамки простого запуска Linux‑окружений в браузерах. Например, порт может применяться для создания многоплатформенных WebAssembly программ, использующих специфичные для Linux системные вызовы. Реализация подобных системных вызовов может быть отдельно преобразована в WebAssembly и прикреплена к приложению, что позволит использовать его без привязки к системному ядру. Порт также будет полезен для организации изолированного выполнения приложений при помощи WASI (WebAssembly System Interface).
Из планов команды Wasm для Linux упоминаются эксперименты с реализацией поддержки графики в окружениях с ядром Linux, собранным в WebAssembly — на базе браузерного API WebGL планируют реализовать EGL и обеспечить работу OpenGL ES. Также планируется реализовать поддержку отладочного формата Dwarf для построчной отладки кода.
Источник: habr.com