Em geral, os eBPFs operam como máquinas virtuais (VMs) dentro do kernel do Linux, trabalhando em uma arquitetura de conjunto de instruções de baixo nível e executando o bytecode do eBPF. No entanto, o complexo processo de execução de um programa eBPF tende a seguir algumas etapas principais.
Primeiro, os desenvolvedores escrevem o programa eBPF e compilam o bytecode. A finalidade do programa ditará o tipo apropriado de código. Por exemplo, se uma equipe quiser monitorar o uso da CPU, escreverá um código contendo funcionalidade para capturar métricas de uso.
Depois que o compilador eBPF converte o código C de alto nível em bytecode de nível inferior, um carregador de espaço do usuário gera uma chamada de sistema BPF para carregar o programa no kernel. O carregador também é responsável por solucionar erros e configurar qualquer mapa eBPF de que o programa precisar.
Com o bytecode e os mapas do programa prontos, o eBPF executará um processo de verificação para garantir que o programa seja seguro para execução no kernel. Se for considerado inseguro, a chamada do sistema para carregar o programa falhará e o programa carregador receberá uma mensagem de erro. Se o programa passar na verificação, poderá ser executado.
Usando um intérprete ou um compilador JIT, o eBPF traduzirá o bytecode em código de máquina executável. No entanto, o eBPF é uma tecnologia baseada em eventos, por isso só será executado em resposta a pontos de gancho ou eventos específicos dentro do kernel (como chamadas de sistema, eventos de rede, iniciação de processo, ociosidade da CPU etc.). Se ocorrer um evento, o eBPF executará o programa bytecode correspondente, permitindo que os desenvolvedores inspecionem e manipulem vários componentes do sistema.
Depois que o programa eBPF estiver em execução, os desenvolvedores poderão interagir com ele a partir do espaço do usuário com mapas eBPF. Por exemplo, o aplicativo pode verificar periodicamente um mapa para coletar dados do programa eBPF, ou pode atualizar um mapa para alterar o comportamento do programa.
Descarregar o programa é a etapa final da maioria dos processos de execução do eBPF. Quando o eBPF fez seu trabalho, o carregador pode usar a chamada do sistema BPF novamente para descarregá-lo do kernel, quando então o eBPF encerra a execução e libera seus recursos associados. O processo de descarregamento também pode incluir iterações sobre quaisquer mapas eBPF de que a equipe não precise mais liberar elementos individuais úteis e, em seguida, excluir o próprio mapa (com a chamada de sistema "excluir").