Im Allgemeinen arbeiten eBPFs als Virtual Machines (VMs) innerhalb des Linux-Kernels, die mit einer Low-Level-Befehlssatzarchitektur arbeiten und eBPF-Bytecode ausführen. Der komplexe Prozess der Ausführung eines eBPF-Programms folgt jedoch in der Regel bestimmten Hauptschritten.
Entwickler schreiben zuerst das eBPF-Programm und kompilieren den Bytecode. Der Zweck des Programms bestimmt den geeigneten Codetyp. Wenn ein Team beispielsweise die CPU-Nutzung überwachen möchte, schreibt es Code, der Funktionen zum Erfassen von Nutzungsmetriken enthält.
Sobald der eBPF-Compiler den High-Level-C-Code in Low-Level-Bytecode konvertiert, generiert ein User-Space-Loader einen BPF-Systemaufruf, um das Programm in den Kernel zu laden. Der Loader ist auch dafür verantwortlich, Fehler zu beheben und alle eBPF-Karten einzurichten, die das Programm benötigt.
Wenn der Bytecode und die Karten des Programms vorhanden sind, führt der eBPF einen Prüfungsprozess durch, um sicherzustellen, dass das Programm sicher im Kernel ausgeführt werden kann. Wenn es als unsicher eingestuft wird, schlägt der Systemaufruf zum Laden des Programms fehl und das Loader-Programm erhält eine Fehlermeldung. Wenn das Programm die Prüfung besteht, darf es ausgeführt werden.
Mithilfe eines Interpreters oder eines JIT-Compilers übersetzt das eBPF den Bytecode in umsetzbaren Maschinencode. Bei eBPF handelt es sich jedoch um eine ereignisgesteuerte Technologie, die nur auf bestimmte Hook-Points oder Ereignisse innerhalb des Kernels reagiert (z. B. Systemanrufe, Netzwerkereignisse, Prozessinitiierung, CPU-Leerlauf usw.). Wenn ein Ereignis auftritt, führt eBPF das entsprechende Bytecode-Programm aus, sodass Entwickler verschiedene Komponenten des Systems überprüfen und manipulieren können.
Sobald das eBPF-Programm ausgeführt wird, können Entwickler vom Benutzerbereich aus mithilfe von eBPF-Karten damit interagieren. Beispielsweise könnte die Anwendung regelmäßig eine Karte überprüfen, um Daten vom eBPF-Programm zu sammeln, oder sie könnte eine Karte aktualisieren, um das Verhalten des Programms zu ändern.
Das Entladen des Programms ist der letzte Schritt der meisten eBPF-Ausführungsprozesse. Wenn der eBPF seine Arbeit erledigt hat, kann der Loader den BPF-Systemaufruf erneut verwenden, um ihn aus dem Kernel zu entladen. An diesem Punkt stoppt der eBPF und gibt die zugehörigen Ressourcen frei. Der Entladevorgang kann auch das Durchlaufen aller eBPF-Karten umfassen, die das Team nicht mehr benötigt, um nützliche einzelne Elemente freizugeben, und das anschließende Löschen der Karte selbst (mithilfe des Systemaufrufs „delete“).