In genere, gli eBPF funzionano come virtual machine (VM) all'interno del kernel Linux, lavorando su un'architettura a basso livello di istruzioni ed eseguendo il bytecode eBPF. Tuttavia, il complesso processo di esecuzione di un programma eBPF tende a seguire alcuni passaggi principali.
Gli sviluppatori prima scrivono il programma eBPF, poi compilano il codice a barre. Lo scopo del programma determinerà il tipo di codice appropriato. Ad esempio, se un team vuole monitorare l'utilizzo della CPU, scriverà codice che include funzionalità per l'acquisizione delle metriche di utilizzo.
Una volta che il compilatore eBPF converte il codice C di alto livello in un bytecode di livello inferiore, un caricatore di spazio utente genererà una chiamata di sistema BPF per caricare il programma nel kernel. Il caricatore è anche responsabile della risoluzione degli errori e dell'impostazione di tutte le mappe eBPF necessarie al programma.
Con il bytecode e le mappe del programma in atto, l'eBPF eseguirà un processo di verifica per garantire che l'esecuzione del programma nel kernel sia sicura. Se viene ritenuto non sicuro, la chiamata di sistema per caricare il programma fallirà e il programma di caricamento riceverà un messaggio di errore. Se il programma supera la verifica, può essere eseguito.
Utilizzando un interprete o un compilatore JIT, eBPF tradurrà il codice bytecode in codice macchina fruibile. Tuttavia, eBPF è una tecnologia basata sugli eventi, quindi verrà eseguita solo in risposta a specifici punti hook o eventi all'interno del kernel (come chiamate di sistema, eventi di rete, avvio di processi, inattività della CPU, ecc.). Quando si verifica un evento, eBPF eseguirà il programma bytecode corrispondente, consentendo agli sviluppatori di ispezionare e manipolare vari componenti del sistema.
Quando il programma eBPF viene eseguito, gli sviluppatori possono interagire con esso dallo spazio utente utilizzando le mappe eBPF. Ad esempio, l'applicazione potrebbe controllare periodicamente una mappa per raccogliere dati dal programma eBPF oppure potrebbe aggiornare una mappa per modificare il comportamento del programma.
Lo scarico del programma è il passaggio finale della maggior parte dei processi di esecuzione di eBPF. Quando l'eBPF ha fatto il suo lavoro, il caricatore può utilizzare di nuovo il sistema BPF per scaricarlo dal kernel. A quel punto l'eBPF smette di funzionare e libera le risorse associate. Il processo di scarico può anche includere l'iterazione su qualsiasi mappa eBPF di cui il team non ha più bisogno per liberare singoli elementi utili, e quindi l'eliminazione della mappa stessa (utilizzando la chiamata di sistema "delete").