La sesta versione di patch per il kernel Linux con supporto per il linguaggio Rust

Miguel Ojeda, autore del progetto Rust-for-Linux, ha proposto il rilascio di componenti v6 per lo sviluppo di driver di dispositivo nel linguaggio Rust affinché vengano presi in considerazione dagli sviluppatori del kernel Linux. Questa è la settima edizione delle patch, tenendo conto della prima versione, pubblicata senza numero di versione. Il supporto a Rust è considerato sperimentale, ma è già incluso nel ramo linux-next ed è sufficientemente sviluppato per iniziare a lavorare sulla creazione di livelli di astrazione sui sottosistemi del kernel, nonché sulla scrittura di driver e moduli. Lo sviluppo è finanziato da Google e dall'ISRG (Internet Security Research Group), che è il fondatore del progetto Let's Encrypt e promuove HTTPS e lo sviluppo di tecnologie per migliorare la sicurezza su Internet.

Nella nuova versione:

  • Il toolkit e una variante della libreria alloc, liberata dalla possibile generazione di uno stato di "panico" quando si verificano errori, sono stati aggiornati alla versione di Rust 1.60, che stabilizza il supporto per la modalità "forse_uninit_extra" utilizzata nelle patch del kernel.
  • Aggiunta la possibilità di eseguire test dalla documentazione (test che vengono utilizzati anche come esempi nella documentazione), attraverso la conversione in fase di compilazione dei test legati all'API del kernel in test KUnit eseguiti durante il caricamento del kernel.
  • Sono stati adottati requisiti secondo cui i test non dovrebbero risultare in un avviso di linter Clippy, proprio come il codice del kernel di Rust.
  • Viene proposta una prima implementazione del modulo “net” con funzioni di rete. Il codice Rust ha accesso alle strutture di rete del kernel come Namespace (basato sulla struttura del kernel struct net), SkBuff (struct sk_buff), TcpListener, TcpStream (struct socket), Ipv4Addr (struct in_addr), SocketAddrV4 ( struct sockaddr_in) e i loro equivalenti IPv6 .
  • Esiste un supporto iniziale per le tecniche di programmazione asincrona (async), implementate sotto forma di modulo kasync. Ad esempio, puoi scrivere codice asincrono per manipolare i socket TCP: async fn echo_server(stream: TcpStream) -> Result { let mut buf = [0u8; 1024]; loop { let n = stream.read(&mut buf).aspetta?; if n == 0 { return Ok(()); } stream.write_all(&buf[..n]).await?; } }
  • Aggiunto modulo net::filter per manipolare i filtri dei pacchetti di rete. Aggiunto esempio ruggine_netfilter.rs con un'implementazione del filtro nel linguaggio Rust.
  • Aggiunta l'implementazione di un semplice mutex smutex::Mutex, che non richiede il blocco.
  • Aggiunto NoWaitLock, che non attende mai un lock e, se occupato da un altro thread, provoca la segnalazione di un errore quando si tenta di acquisire il lock invece di fermare il chiamante.
  • Aggiunto RawSpinLock, identificato da raw_spinlock_t nel kernel, da applicare alle sezioni che non possono essere inattive.
  • Aggiunto il tipo ARef per i riferimenti a un oggetto a cui viene applicato il meccanismo di conteggio dei riferimenti (sempre conteggiato).
  • Il backend rusticc_codegen_gcc, che consente di utilizzare la libreria libgccjit del progetto GCC come generatore di codice in rusticc per fornire a rusticc il supporto per le architetture e le ottimizzazioni disponibili in GCC, ha implementato la possibilità di avviare il compilatore rusticc. La promozione del compilatore implica la possibilità di utilizzare un generatore di codice basato su GCC in rusticc per creare il compilatore rusticc stesso. Inoltre, la recente versione di GCC 12.1 include le correzioni a libgccjit necessarie affinché ruggine_codegen_gcc funzioni correttamente. Sono in corso i preparativi per fornire la possibilità di installare Rustc_codegen_gcc utilizzando l'utilità Rustup.
  • Si segnalano i progressi nello sviluppo del frontend GCC gccrs con l'implementazione del compilatore del linguaggio Rust basato su GCC. Attualmente ci sono due sviluppatori a tempo pieno che lavorano su gccrs.

Ricordiamo che le modifiche proposte rendono possibile utilizzare Rust come secondo linguaggio per lo sviluppo di driver e moduli del kernel. Il supporto Rust è presentato come un'opzione che non è abilitata per impostazione predefinita e non comporta l'inclusione di Rust come dipendenza di compilazione richiesta per il kernel. Usare Rust per lo sviluppo dei driver ti consentirà di creare driver più sicuri e migliori con il minimo sforzo, esenti da problemi come l'accesso alla memoria dopo la liberazione, i riferimenti a puntatori nulli e i sovraccarichi del buffer.

La gestione sicura della memoria viene fornita in Rust in fase di compilazione attraverso il controllo dei riferimenti, tenendo traccia della proprietà dell'oggetto e della durata dell'oggetto (ambito), nonché attraverso la valutazione della correttezza dell'accesso alla memoria durante l'esecuzione del codice. Rust fornisce anche protezione contro gli overflow di numeri interi, richiede l'inizializzazione obbligatoria dei valori delle variabili prima dell'uso, gestisce meglio gli errori nella libreria standard, applica il concetto di riferimenti e variabili immutabili per impostazione predefinita, offre una forte tipizzazione statica per ridurre al minimo gli errori logici.

Fonte: opennet.ru

Aggiungi un commento