Na liście mailingowej deweloperów jądra Linux opublikowano poprawki implementujące architekturę „Wasm” dla jądra Linux, umożliwiającą kompilację jądra do pośredniego kodu WebAssembly do późniejszego bezpośredniego wykonania w przeglądarce internetowej bez potrzeby korzystania z emulatorów. Dodatkowo, dla jądra Linux projekt umożliwił uruchamianie plików wykonywalnych w formacie „.wasm” oraz przygotowano sterownik „web console” do symulacji pracy z konsolą w przeglądarce. Opracowano również narzędzia ułatwiające budowanie uruchamianych w przeglądarce środowisk systemowych.
Jako przykład stworzono środowisko oparte na skompilowanym w WebAssembly zestawie narzędzi BusyBox oraz bibliotece systemowej musl. Jako emulator terminala do pracy w takim środowisku wykorzystano Xterm.js. Uruchomiono osobno stronę demonstracyjną, która pozwala ocenić działanie portu bez samodzielnej kompilacji. Zapewniono pełne wsparcie dla przeglądarek opartych na silniku Chromium oraz częściowe wsparcie dla Firefox, w którym możliwości debugowania są ograniczone. Na współczesnych komputerach ładowanie Wasm-skompilowanej wersji jądra w przeglądarce trwa mniej niż sekundę.
Projekt rozwija się już od około dwóch lat i na текущим etapie pozwala na załadowanie jądra w przeglądarkach oraz wykonywanie typowych programów. Prace jeszcze się nie zakończyły, a port ma pewne problemy i ograniczenia. Na przykład, jeszcze nie zaimplementowano wsparcia dla wywołań vfork i longjmp (do BusyBox zastosowano poprawki, aby działał bez nich), brakuje możliwości przerywania zadań, nie jest dostępny MMU (jądro i procesy działają w jednej przestrzeni adresowej), nie można zmieniać już załadowanego kodu, a konsola zawiesza się po około 5 minutach z powodu problemów z timerem. Zauważono, że istniejące ograniczenia są do przezwyciężenia, jednak dla niektórych z nich wymagana jest implementacja dodatkowych rozszerzeń WebAssembly w przeglądarkach. Proponowano wdrożenie takich rozszerzeń dla MMU i wstrzymywania wątków.
Niemożność wstrzymania wykonywania wątków w WebAssembly nie współgra z działaniem planera zadań w jądrze, ale wielozadaniowość udało się zrealizować obejściem, przez przypisanie każdego wątku/zadania do swojego wirtualnego CPU, przetwarzanego w oddzielnym Web Workerze. Dzięki temu osiągnięto równoległe wykonywanie procesów za pomocą silnika przeglądarki i jądra systemu operacyjnego hosta bez konieczności korzystania z wymuszonej wielozadaniowości i przełączania zadań w uruchomionym jądrze przeglądarki. Przerwania i sygnały w tym schemacie nie działają w pełni, a do dostarczania przerwań timera i IPI (Inter-Processor Interrupt) zaangażowano oddzielny wirtualny CPU.
Zakres zastosowania projektu wykracza poza proste uruchamianie środowisk Linux w przeglądarkach. Na przykład, port może być wykorzystywany do tworzenia wieloplatformowych programów WebAssembly, które korzystają ze specyficznych dla Linux wywołań systemowych. Implementacja takich wywołań systemowych może być oddzielnie przekształcona w WebAssembly i dołączona do aplikacji, co pozwoli na korzystanie z niej bez związania z systemowym jądrem. Port będzie również przydatny do organizowania izolowanego wykonania aplikacji za pomocą WASI (WebAssembly System Interface).
W planach wymieniane są eksperymenty z wdrożeniem wsparcia dla grafiki w środowiskach z jądrem zbudowanym w WebAssembly – na bazie API przeglądarki WebGL planują wdrożyć EGL i zapewnić działanie OpenGL ES. Przewiduje się również wdrożenie wsparcia dla formatu debugowania Dwarf do liniowego debugowania kodu.
Źródło: opennet.ru
