Miguel Ojeda, autore del progetto Rust-for-Linux, ha proposto agli sviluppatori del kernel Linux una terza opzione per i componenti per lo sviluppo di driver per dispositivi in linguaggio Rust. Il supporto per Rust è considerato sperimentale, ma è già stato approvato per l'inclusione nel ramo linux-next. Lo sviluppo è finanziato da Google e dall'organizzazione ISRG (Internet Security Research Group), che è fondatrice del progetto Let’s Encrypt e contribuisce alla promozione di HTTPS e allo sviluppo di tecnologie per migliorare la sicurezza di Internet.
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 porta all'inclusione di Rust tra le dipendenze di compilazione obbligatorie per il kernel. L'uso di Rust per lo sviluppo di driver permetterà di creare driver sicuri e di qualità superiore con il minimo sforzo, eliminando problemi come l'accesso alla memoria dopo che è stata liberata, la dereferenza di puntatori nulli e il superamento dei limiti del buffer.
La gestione sicura della memoria in Rust è garantita durante la compilazione attraverso il controllo dei riferimenti, il tracciamento della proprietà degli oggetti e la gestione del tempo di vita degli oggetti (ambito di visibilità), nonché attraverso la valutazione della correttezza dell'accesso alla memoria durante l'esecuzione del codice. Rust fornisce anche strumenti per proteggersi dai sovraccarichi interi, richiede l'inizializzazione obbligatoria dei valori delle variabili prima dell'uso, gestisce meglio gli errori nella libreria standard, applica il concetto di immutabilità (immutable) per riferimenti e variabili per impostazione predefinita e offre una forte tipizzazione statica per minimizzare gli errori logici.
Nella nuova versione delle patch, è proseguita l'eliminazione delle osservazioni espresse durante la discussione delle prime e seconde versioni delle patch. Le modifiche più significative sono:
- È stato effettuato il passaggio all'uso come compilatore di riferimento della versione stabile di Rust 1.57 e assicurata la compatibilità con l'edizione stabilizzata del linguaggio Rust 2021. In precedenza, le patch erano collegate al ramo beta di Rust e utilizzavano alcune funzionalità del linguaggio considerate instabili. Il passaggio alla specifica Rust 2021 ha permesso di avviare il lavoro per eliminare l'uso in patch di funzionalità instabili come const_fn_transmute, const_panic, const_unreachable_unchecked e core_panic e try_reserve.
- È continuato lo sviluppo della variante della libreria Rust alloc inclusa nelle patch, modificata per eliminare le funzioni di allocazione della memoria dalla possibile generazione di stati di "panic" in caso di errori, come la mancanza di memoria. Nella nuova versione sono state implementate le opzioni "no_rc" e "no_sync" per disabilitare la funzionalità non utilizzata nel codice Rust per il kernel, rendendo la libreria più modulare. Il lavoro continua con i principali sviluppatori di alloc, mirato a trasferire le modifiche necessarie per il kernel nella libreria principale. Nell'archivio di libreria Rust (core) è stata trasferita l'opzione "no_fp_fmt_parse", necessaria per il funzionamento della libreria a livello di kernel.
- È stata effettuata una pulizia del codice per rimuovere possibili avvisi del compilatore durante la compilazione del kernel in modalità CONFIG_WERROR. Durante la compilazione del codice in Rust sono state attivate ulteriori modalità diagnostiche del compilatore e avvisi dell'analizzatore Clippy.
- Sono state proposte astrazioni per l'utilizzo nel codice Rust di blocchi seqlock (lock di sequenza), chiamate di callback per la gestione dell'alimentazione, I/O Memory (readX/writeX), gestori di interruzioni e thread, GPIO, accesso a dispositivi, driver e credenziali.
- Espansi gli strumenti per lo sviluppo di driver con l'uso di mutex mobili, iteratori bit, binding semplificati su puntatori, diagnostica migliorata dei guasti e infrastruttura indipendente dal bus dei dati.
- Migliorato il lavoro con i riferimenti grazie a un tipo semplificato Ref, basato sul backend refcount_t, che utilizza l'API omonima del kernel per il conteggio dei riferimenti. Il supporto per i tipi Arc e Rc, forniti dalla libreria alloc, è stato rimosso e non è disponibile nel codice eseguito a livello di kernel (per la libreria stessa sono state preparate opzioni per disabilitare questi tipi).
- Nei patch è stata aggiunta una variante del driver PL061 GPIO, riscritta in Rust. La caratteristica principale del driver è che la sua implementazione praticamente ripete riga per riga il driver GPIO esistente in C. Per gli sviluppatori che desiderano conoscere la creazione di driver in Rust, è stata preparata una comparazione riga per riga, per comprendere in quali strutture di Rust è stato trasformato il codice in C.
- Nella base di codice principale di Rust è stato accolto rustc_codegen_gcc, il backend rustc per GCC, che implementa la possibilità di compilazione anticipata (AOT) utilizzando la libreria libgccjit. Con lo sviluppo adeguato del backend, consentirà di compilare il codice Rust utilizzato nel kernel tramite GCC.
- Oltre alle aziende ARM, Google e Microsoft, anche Red Hat ha espresso interesse per l'utilizzo del linguaggio Rust nel kernel Linux. Ricordiamo che Google fornisce supporto diretto al progetto Rust for Linux, sviluppa una nuova implementazione del meccanismo di comunicazione interprocesso Binder in Rust e sta considerando la revisione di vari driver in Rust. Microsoft ha iniziato a implementare driver per Hyper-V in Rust. ARM sta lavorando per migliorare il supporto di Rust per i sistemi basati su processori ARM. IBM ha implementato il supporto di Rust nel kernel per i sistemi PowerPC.
Fonte: opennet.ru
