Im Set der GCC-Compiler Code zur Kompilierung von Programmen für den in den Linux-Kernel eingebetteten Bytecode-Interpreter . Dank der Anwendung von JIT-Kompilierung wird Bytecode im Kernel zur Laufzeit in Maschineninstruktionen übersetzt und mit der Leistung von nativen Code ausgeführt. Patches mit Unterstützung für eBPF in den Branch, auf dem die GCC 10-Version entwickelt wird.
Neben dem Backend zur Generierung von Bytecode beinhaltet GCC einen Port von libgcc für eBPF und Tools zur Erstellung von ELF-Dateien, die es ermöglichen, Code in der eBPF-virtuellen Maschine mit den vom Kernel bereitgestellten Bootloadern auszuführen. Patches zur Unterstützung von eBPF in GCC wurden von Ingenieuren der Firma Oracle vorbereitet, die zuvor bereits eBPF in GNU binutils. In Entwicklung befindet sich auch ein Simulator sowie Patches für GDB, die das Debuggen von eBPF-Programmen ohne Kernbeladung ermöglichen.
Programme für eBPF können in einer Teilmenge der C-Sprache definiert, kompiliert und in den Kernel geladen werden. Vor der Ausführung überprüft der eBPF-Interpreter den Bytecode auf die Einhaltung der zulässigen Instruktionen und legt bestimmte Regeln für den Code fest (z. B. keine Schleifen).
Ursprünglich wurde zur Kompilierung von eBPF in Linux ein auf LLVM basierendes Toolset verwendet. Die Unterstützung von eBPF in GCC ist interessant, da sie die Verwendung eines einzigen Toolsets zur Erstellung des Linux-Kernels und von eBPF-Programmen ermöglicht, ohne zusätzliche Abhängigkeiten installieren zu müssen.
In Form von eBPF-Programmen lassen sich Netzwerkoperationen verarbeiten, Verkehr filtern, Bandbreite verwalten, Systemaktivitäten überwachen, Systemaufrufe abfangen, Zugriffe kontrollieren, Häufigkeit und Ausführungszeit von Vorgängen zählen sowie mit kprobes/uprobes/tracepoints Debugging durchführen.
Quelle: opennet.ru
