Miguel Ojeda, autore del progetto Rust-for-Linux, ha proposto agli sviluppatori del kernel Linux il rilascio della versione 6 dei componenti per lo sviluppo di driver per dispositivi in linguaggio Rust. Questa è la settima edizione delle patch, considerando la prima versione pubblicata senza numero di versione. Il supporto per Rust è considerato sperimentale, ma è già stato incluso nel ramo linux-next ed è sufficientemente sviluppato per iniziare a lavorare sulla creazione di strati di astrazione sulle sottosistemi del kernel, oltre che per scrivere driver e moduli. Lo sviluppo è finanziato da Google e dall'organizzazione ISRG (Internet Security Research Group), che è il fondatore del progetto Let's Encrypt e contribuisce alla promozione di HTTPS e allo sviluppo di tecnologie per migliorare la sicurezza di Internet.
Nella nuova versione:
- Gli strumenti e la variante della libreria alloc, privi di possibili generazioni dello stato 'panic' in caso di errori, sono stati aggiornati alla versione Rust 1.60, in cui è stata stabilizzata la supporto per la modalità 'maybe_uninit_extra', applicata alle patch del kernel.
- È stata aggiunta la possibilità di eseguire test dalla documentazione (test utilizzati anche come esempi nella documentazione), attraverso la trasformazione durante la compilazione dei test legati all'API del kernel in test KUnit, eseguiti durante l'avvio del kernel.
- Sono state adottate le richieste in base alle quali i test non devono generare avvisi del linter Clippy, così come il codice per il kernel in linguaggio Rust.
- È stata proposta un'implementazione iniziale del modulo 'net' con funzioni di rete. Per il codice in linguaggio Rust è stato fornito l'accesso a 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 ai loro equivalenti per IPv6.
- È stata implementata un'implementazione iniziale dei metodi di programmazione asincrona (async), realizzata sotto forma di modulo kasync. Ad esempio, è possibile creare codice funzionante in modalità asincrona per la manipolazione di socket TCP: async fn echo_server(stream: TcpStream) -> Result { let mut buf = [0u8; 1024]; loop { let n = stream.read(&mut buf).await?; if n == 0 { return Ok(()); } stream.write_all(&buf[..n]).await?; } }
- È stato aggiunto il modulo net::filter per la manipolazione dei filtri dei pacchetti di rete. È stato aggiunto l'esempio rust_netfilter.rs con l'implementazione di un filtro in linguaggio Rust.
- È stata aggiunta l'implementazione di un semplice mutex smutex::Mutex, che non richiede pinning.
- È stata aggiunta una lock NoWaitLock, che non porta mai a un'attesa di rilascio e, nel caso in cui sia occupata da un altro thread, produce un errore al tentativo di acquisire il lock invece di fermare il chiamante.
- È stata aggiunta una lock RawSpinLock, identificata con raw_spinlock_t nel kernel, applicata a sezioni che non possono trovarsi in uno stato di attesa.
- È stato aggiunto il tipo ARef per riferimenti a oggetti, a cui viene applicato il meccanismo di conteggio dei riferimenti (always-refcounted).
- Nel backend rustc_codegen_gcc, che consente di utilizzare la libreria libgccjit del progetto GCC come generatore di codice in rustc per fornire il supporto in rustc per le architetture e le ottimizzazioni disponibili in GCC, è stata implementata la possibilità di bootstrapping del compilatore rustc. Con bootstrapping del compilatore si intende la possibilità di utilizzare in rustc un generatore di codice basato su GCC per compilarlo. Inoltre, nella recente release GCC 12.1 sono state incluse correzioni in libgccjit necessarie per il corretto funzionamento di rustc_codegen_gcc. Si sta preparando per offrire la possibilità di installare rustc_codegen_gcc tramite l'utilità rustup.
- Si segnala un progresso nello sviluppo del front-end GCC gccrs con l'implementazione di un compilatore del linguaggio Rust basato su GCC. Attualmente, due sviluppatori stanno lavorando a gccrs in modalità completamente operativa.
Ricordiamo che le modifiche proposte consentono di utilizzare Rust come secondo linguaggio per lo sviluppo di driver e moduli del kernel. Il supporto per Rust è presentato come un'opzione, non attiva per impostazione predefinita e non comporta l'inclusione di Rust tra le dipendenze di build obbligatorie per il kernel. L'utilizzo di Rust per la creazione di driver permetterà di realizzare driver sicuri e di maggiore qualità con un minimo sforzo, eliminando problemi come l'accesso alla memoria dopo che è stata liberata, la dereferenzazione di puntatori nulli e il superamento dei limiti del buffer.
La gestione sicura della memoria in Rust viene garantita durante la compilazione tramite il controllo dei riferimenti, il tracciamento della proprietà degli oggetti e la gestione del tempo di vita degli oggetti (scope), nonché tramite la valutazione della correttezza dell'accesso alla memoria durante l'esecuzione del codice. Rust fornisce anche strumenti per proteggere contro i sovraccarichi numerici, 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 (immutable) per impostazione predefinita e offre una forte tipizzazione statica per minimizzare gli errori logici.
Fonte: opennet.ru
