De GCC-compiler set bevat code voor het compileren van programma's voor de in de Linux-kernel ingebouwde bytecode-interpreter . Dankzij JIT-compilatie wordt de bytecode in de kernel on-the-fly naar machine-instructies vertaald en uitgevoerd met de prestaties van native code. Patches voor eBPF-ondersteuning onder de tak waarop de release van GCC 10 wordt ontwikkeld.
Naast de backend voor bytecode-generatie bevat GCC een port van libgcc voor eBPF en hulpmiddelen voor het genereren van ELF-bestanden, waarmee code kan worden uitgevoerd in de eBPF-virtuele machine met de door de kernel geleverde bootloaders. Patches voor eBPF-ondersteuning in GCC zijn voorbereid door ingenieurs van Oracle, die eerder al voor eBPF in GNU binutils verschafte. Er wordt ook gewerkt aan een simulator en patches voor GDB, waarmee eBPF-programma's kunnen worden gedebugd zonder ze in de kernel te laden.
eBPF-programma's kunnen worden gedefinieerd in een subset van de C-taal, gecompileerd en in de kernel geladen. Voor uitvoering controleert de eBPF-interpreter de bytecode op het gebruik van toegestane instructies en legt bepaalde regels op aan de code (bijvoorbeeld het verbod op lussen).
Oorspronkelijk werd voor het compileren van eBPF in Linux een op LLVM gebaseerde toolset gebruikt. De ondersteuning van eBPF in GCC is interessant omdat het mogelijk maakt om ƩƩn toolset te gebruiken voor de compilatie van de Linux-kernel en eBPF-programma's, zonder extra afhankelijkheden te hoeven installeren.
In de vorm van eBPF-programma's kunnen netwerkaanroep handlers worden gemaakt, verkeer gefilterd, bandbreedte beheerd, systeemactiviteiten gevolgd, systeemaanroepen onderschept, toegang gecontroleerd, de frequentie en uitvoeringstijd van operaties geteld, en tracing uitgevoerd met behulp van kprobes/uprobes/tracepoints.
Bron: opennet.ru
