Przedstawiony KernelScript — eksperymentalny język programowania do tworzenia programów eBPF, ładowarek użytkownika i rozszerzeń jądra Linux z jednego kodu. Projekt rozwija Multikernel Technologies, firma promująca architekturę split-kernel / multikernel dla Linux. O KernelScript opowiedział założyciel firmy Cong Wang podczas Open Source Summit Fundacji Linuxa; kod projektu został opublikowany na GitHubie na licencji Apache 2.0.
eBPF (Extended Berkeley Packet Filter) — to technologia, która pozwala uruchamiać małe programy bezpośrednio w jądrze Linux, nie dotykając jego kodu i nie narażając stabilności systemu. eBPF pomaga rozwiązywać wiele problemów, od monitorowania wydajności po zapewnienie bezpieczeństwa i optymalizacji sieci. Na przykład, za pomocą eBPF można śledzić wywołania systemowe, ruch sieciowy i inne zdarzenia w czasie rzeczywistym. Pozwala to zidentyfikować wąskie gardła w wydajności i zoptymalizować system (Hub).
Idea KernelScript polega na uproszczeniu procesu tworzenia eBPF w porównaniu do korzystania z zestawu C + libbpf, a jednocześnie nie ogranicza się tylko do śledzenia, jak bpftrace. Programiści opisują język jako typowo bezpieczny DSL, który łączy eBPF, rozwój w przestrzeni użytkownika i kernelspace: z jednego pliku źródłowego kompilator powinien generować kod dla programów eBPF, części userspace i integracji z modułami jądra przez kfunc.
Zadeklarowane możliwości KernelScript:
Kompilacja pod różne cele z jednego pliku — funkcje z atrybutami takimi jak @xdp, @tc, @helper i @kfunc automatycznie są przyporządkowywane do odpowiedniej części: program XDP/TC, funkcje pomocnicze, funkcje jądra lub zwykły kod userspace.
Automatyzacja wywołań tail calls — zamiast ręcznej konfiguracji program array i wywołań bpf_tail_call(), programiści mogą po prostu napisać zwykłe wywołanie innej funkcji, a generację niskopoziomowego kodu eBPF pozostawić kompilatorowi.
Uproszczona praca z dynptr i mapami eBPF — język ukrywa część ręcznej pracy z bpf_ringbuf_reserve_dynptr, bpf_dynptr_write i podobnymi interfejsami API. Mapy eBPF mogą być traktowane jak zmienne globalne, dostępne dla różnych programów.
Kontrola cyklu życia programów — programy eBPF są przedstawione jako typowane wartości, co ma na celu zapobieganie błędom na etapie kompilacji, takim jak próba wykonania attach() przed udanym load().
Wsparcie dla kfunc — KernelScript umożliwia deklarowanie funkcji z atrybutem @kfunc, które są wykonywane w przestrzeni jądra i mogą być wywoływane z programów eBPF; obiecano automatyczne generowanie modułu jądra i rejestracji BTF.
Wsparcie dla podstawowych typów programów eBPF — w README znajdują się przykłady dla XDP, TC, programów probe i perf_event, w tym praca z sprzętowymi licznikami wydajności.
Autorzy szczególnie podkreślają, że KernelScript nie jest zamiennikiem dla jądra Linux ani nowym runtime'm eBPF. To raczej kompilator i język wyższego poziomu, który ma generować znane komponenty niskiego poziomu: kod eBPF, ładowarki userspace, Makefile i, w razie potrzeby, moduł jądra.
Na razie projekt należy traktować jako wczesny eksperyment. W repozytorium wyraźnie wskazano, że KernelScript znajduje się w fazie beta, składnia i API mogą się zmieniać bez zapewnienia wstecznej kompatybilności, a korzystanie z niego w produkcji na razie nie jest zalecane.
Źródło: linux.org.ru
