Il set di compilatori GCC include il codice per la compilazione di programmi per l'interprete di bytecode integrato nel kernel di Linux . Grazie all'uso della compilazione JIT, il bytecode nel kernel viene tradotto in istruzioni macchina in tempo reale e viene eseguito con le prestazioni del codice nativo. Le patch per il supporto di eBPF sono state integrate nel ramo su cui si basa la versione di GCC 10.
Oltre al backend per la generazione di bytecode, GCC include un port di libgcc per eBPF e strumenti per generare file ELF, che consentono di eseguire codice nella macchina virtuale eBPF utilizzando i caricamenti forniti dal kernel. Le patch per il supporto di eBPF in GCC sono state preparate dagli ingegneri di Oracle, i quali avevano già supporto per eBPF in GNU binutils. È in fase di sviluppo anche un simulatore e patch per GDB, che consentiranno di eseguire il debug dei programmi eBPF senza doverli caricare nel kernel.
I programmi per eBPF possono essere definiti in un sottoinsieme del linguaggio C, compilati e caricati nel kernel. Prima dell'esecuzione, l'interprete eBPF verifica il bytecode per l'uso delle istruzioni autorizzate e impone determinate regole sul codice (ad esempio, l'assenza di cicli).
Inizialmente per la compilazione di eBPF in Linux veniva utilizzato uno strumento basato su LLVM. Il supporto di eBPF in GCC è interessante perché consente di utilizzare un unico strumento per la compilazione del kernel di Linux e dei programmi eBPF, senza dover installare ulteriori dipendenze.
Sotto forma di programmi, eBPF può essere utilizzato per creare gestori di operazioni di rete, filtrare il traffico, gestire la banda, monitorare le prestazioni dei sistemi, intercettare chiamate di sistema, controllare gli accessi, conteggiare la frequenza e il tempo di esecuzione delle operazioni, eseguire il tracciamento utilizzando kprobes/uprobes/tracepoints.
Fonte: opennet.ru
