GCC zawiera teraz backend do kompilacji do eBPF

Zawarte w pakiecie kompilatorów GCC przyjęty kod do kompilacji programów dla interpretera kodu bajtowego wbudowanego w jądro Linuksa eGMP. Dzięki zastosowaniu kompilacji JIT kod bajtowy jądra jest na bieżąco tłumaczony na instrukcje maszynowe i wykonywany z wydajnością kodu natywnego. Poprawki z obsługą eBPF przyjęty do gałęzi, z której opracowywane jest wydanie GCC 10.

Oprócz backendu do generowania kodu bajtowego, GCC zawiera port libgcc dla eBPF i narzędzia do generowania plików ELF, które umożliwiają wykonanie kodu na maszynie wirtualnej eBPF przy użyciu programów ładujących dostarczonych przez jądro. Poprawki obsługujące eBPF w GCC zostały przygotowane przez inżynierów z Oracle, którzy już to zrobili pod warunkiem, że Obsługa eBPF w binutilach GNU. W przygotowaniu jest także symulator i łatki dla GDB, które pozwolą na debugowanie programów eBPF bez ładowania ich do jądra.

Programy dla eBPF można zdefiniować w podzbiorze języka C, skompilować i załadować do jądra. Przed wykonaniem interpreter eBPF sprawdza kod bajtowy pod kątem użycia dozwolonych instrukcji i nakłada na kod pewne zasady (na przykład brak pętli).
Początkowo do kompilacji eBPF w systemie Linux używano narzędzi opartych na LLVM. Obsługa eBPF w GCC jest interesująca, ponieważ pozwala na użycie jednego zestawu narzędzi do zbudowania jądra Linuksa i programów eBPF, bez instalowania dodatkowych zależności.

W postaci programów eBPF można tworzyć procedury obsługi operacji sieciowych, filtrować ruch, zarządzać przepustowością, monitorować systemy, przechwytywać wywołania systemowe, kontrolować dostęp, zliczać częstotliwość i czas operacji oraz wykonywać śledzenie za pomocą kprobes/uprobes/tracepoints.

Źródło: opennet.ru

Dodaj komentarz