Teil des GCC-Compiler-Set. Code zur Kompilierung von Programmen für den im Linux-Kernel integrierten Bytecode-Interpreter. Durch den Einsatz von JIT-Kompilierung wird der Bytecode im Kernel zur Laufzeit in Maschinenanweisungen übersetzt und mit der Leistung von nativem Code ausgeführt. Patches mit Unterstützung für eBPF wurden in den Branch integriert, auf dessen Basis GCC 10 weiterentwickelt wird.
Neben dem Backend zur Generierung von Bytecode enthält GCC auch einen libgcc-Port für eBPF sowie Tools zur Erstellung von ELF-Dateien, die es ermöglichen, den Code in einer eBPF-VM unter Verwendung der vom Kernel bereitgestellten Loader auszuführen. Patches zur Unterstützung von eBPF in GCC wurden von Ingenieuren der Firma Oracle erstellt, die bereits zuvor Unterstützung für eBPF in GNU binutils ermöglicht hatten. Ebenfalls in der Entwicklung sind ein Simulator und Patches für GDB, die das Debugging von eBPF-Programmen ohne Kernel-Ladung ermöglichen.
eBPF-Programme können in einer Teilmenge der Programmiersprache C definiert, kompiliert und in den Kernel geladen werden. Vor der Ausführung überprüft der eBPF-Interpreter den Bytecode auf die Verwendung zulässiger Anweisungen und legt bestimmte Regeln für den Code fest (z. B. das Fehlen von Schleifen).
Ursprünglich wurde das LLVM-Toolkit zur Kompilierung von eBPF in Linux verwendet. Die Unterstützung von eBPF in GCC ist interessant, da sie es ermöglicht, dasselbe Toolkit für das Erstellen des Linux-Kernels und von eBPF-Programmen zu verwenden, ohne zusätzliche Abhängigkeiten installieren zu müssen.
In Form von eBPF-Programmen können Netzwerkoperationen behandelt, der Datenverkehr gefiltert, die Bandbreite verwaltet, Systemleistung überwacht, Systemaufrufe abgefangen, der Zugriff kontrolliert, die Häufigkeit und die Ausführungszeiten von Operationen gezählt sowie Traces mit kprobes/uprobes/tracepoints ausgeführt werden.
Quelle: opennet.ru
