Presentato KernelScript — un linguaggio di programmazione sperimentale per lo sviluppo di programmi eBPF, bootloader personalizzati e estensioni del kernel Linux da un'unica base di codice. Il progetto è sviluppato Multikernel Technologies, un'azienda che promuove l'architettura split-kernel / multikernel per Linux. Di KernelScript ha parlato il fondatore dell'azienda Cong Wang al Linux Foundation Open Source Summit; il codice del progetto è pubblicato su GitHub sotto licenza Apache 2.0.
eBPF (Extended Berkeley Packet Filter) — è una tecnologia che consente di eseguire piccoli programmi direttamente nel kernel Linux, senza modificare il suo codice e senza compromettere la stabilità del sistema. eBPF aiuta a risolvere molteplici problemi, dal monitoraggio delle prestazioni alla sicurezza e all'ottimizzazione della rete. Ad esempio, tramite eBPF è possibile monitorare le chiamate di sistema, il traffico di rete e altri eventi in tempo reale. Questo permette di identificare colli di bottiglia nelle prestazioni e ottimizzare il sistema (Habr).
L'idea di KernelScript è rendere lo sviluppo di eBPF meno macchinoso rispetto all'uso della combinazione C + libbpf, senza limitarsi unicamente al tracciamento, come bpftrace. Gli sviluppatori descrivono il linguaggio come un DSL sicuro per i tipi, che unisce eBPF, sviluppo nello spazio utente e nello spazio del kernel: a partire da un unico file sorgente, il compilatore deve generare codice per programmi eBPF, parte utente e integrazione con i moduli del kernel attraverso kfunc.
Le funzionalità dichiarate di KernelScript:
Compilazione per obiettivi diversi da un unico file — funzioni con attributi come @xdp, @tc, @helper e @kfunc vengono automaticamente associate alla parte corretta: programma XDP/TC, funzione helper, funzione del kernel o codice normale dello spazio utente.
Automazione delle tail calls — invece di configurare manualmente l'array dei programmi e le chiamate bpf_tail_call(), agli sviluppatori viene consigliato di scrivere una chiamata normale ad un'altra funzione, lasciando al compilatore la generazione del codice eBPF a basso livello.
Lavoro semplificato con dynptr e eBPF maps — il linguaggio nasconde parte del lavoro manuale con bpf_ringbuf_reserve_dynptr, bpf_dynptr_write e API simili. Le mappe eBPF possono essere utilizzate come variabili globali accessibili da differenti programmi.
Controllo del ciclo di vita dei programmi — i programmi eBPF sono rappresentati come valori tipizzati, il che, secondo i progettisti, consente di prevenire errori come tentativi di eseguire attach() prima di un caricamento riuscito durante la fase di compilazione.
Supporto per kfunc — KernelScript consente di dichiarare funzioni con l'attributo @kfunc, che vengono eseguite nello spazio del kernel e possono essere chiamate dai programmi eBPF; per esse è prevista la generazione automatica di moduli del kernel e registrazioni BTF.
Supporto per i principali tipi di programmi eBPF — nel README sono mostrati esempi per programmi XDP, TC, probe e perf_event, incluso il lavoro con i registratori hardware delle prestazioni.
Gli autori sottolineano che KernelScript non è un sostituto del kernel Linux o un nuovo runtime eBPF. È piuttosto un compilatore e un linguaggio di alto livello progettato per generare componenti a basso livello familiari: codice eBPF, bootloader per spazio utente, Makefile e, se necessario, moduli del kernel.
Il progetto va però considerato come un esperimento iniziale. Nel repository è chiaramente indicato che KernelScript è in fase di beta, la sintassi e le API potrebbero cambiare senza mantenere la retrocompatibilità, e l'uso in produzione al momento non è raccomandato.
Fonte: linux.org.ru
