W skład zestawu kompilatorów GCC kod do kompilacji programów dla wbudowanego w jądro Linux interpreteru bajtkodu . Dzięki zastosowaniu JIT-kompilacji, w jądrze bajtkod na bieżąco jest tłumaczony na instrukcje maszynowe i wykonywany z wydajnością kodu natywnego. Łatki z wsparciem eBPF w gałęzi, na podstawie której rozwija się wydanie GCC 10.
Oprócz backendu do generowania bajtkodu GCC zawiera port libgcc dla eBPF oraz narzędzia do tworzenia plików ELF, które umożliwiają uruchamianie kodu w maszynie wirtualnej eBPF przy użyciu dostarczonych przez jądro loaderów. Łatki wspierające eBPF w GCC zostały przygotowane przez inżynierów z firmy Oracle, którzy wcześniej już wsparcie eBPF w GNU binutils. W opracowaniu jest również symulator i łatki dla GDB, które pozwolą na debugowanie programów eBPF bez ładowania do jądra.
Programy dla eBPF mogą być definiowane w podzbiorze języka C, kompilowane i ładowane do jądra. Przed wykonaniem interpreter eBPF sprawdza bajtkod pod kątem stosowania dozwolonych instrukcji i nakłada określone zasady na kod (na przykład brak pętli).
Początkowo do kompilacji eBPF w Linux wykorzystywano narzędzia oparte na LLVM. Wsparcie eBPF w GCC jest interesujące, ponieważ pozwala na użycie jednego zestawu narzędzi do budowy jądra Linux i programów eBPF, bez instalacji dodatkowych zależności.
W formie programów eBPF można tworzyć obsługiwacze operacji sieciowych, filtrować ruch, zarządzać przepustowością, monitorować działanie systemów, przechwytywać wywołania systemowe, kontrolować dostęp, zliczać częstotliwość i czas wykonania operacji, a także wykonywać śledzenie z użyciem kprobes/uprobes/tracepoints.
Źródło: opennet.ru
