Miguel Ojeda, autore del progetto Rust-for-Linux, ha proposto ai sviluppatori del kernel Linux un terzo set di componenti per lo sviluppo di driver di dispositivo utilizzando il 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), fondatrice del progetto Let's Encrypt e promotrice dell'HTTPS e dello 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 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.
Nella nuova versione delle patch sono state continuate le revisioni emerse nel corso delle discussioni delle prime due versioni. Le modifiche più significative includono:
- È stato effettuato il passaggio all'uso della versione stabile del compilatore Rust 1.57 come riferimento, con un collegamento alla versione stabilizzata del linguaggio Rust 2021. In precedenza, le patch erano legate al ramo beta di Rust e utilizzavano alcune caratteristiche del linguaggio classificate come instabili. Il passaggio alla specifica Rust 2021 ha avviato il lavoro per eliminare dalle patch caratteristiche instabili come const_fn_transmute, const_panic, const_unreachable_unchecked e core_panic e try_reserve.
- È continuato lo sviluppo della libreria Rust alloc inclusa nelle patch, modificata per eliminare le funzioni di allocazione della memoria da possibili generazioni 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 funzionalità non utilizzate nel codice Rust per il kernel, rendendo la libreria più modulare. Si stanno proseguendo i lavori con i principali sviluppatori di alloc, mirati a trasferire le modifiche necessarie per il kernel nel corpo principale della libreria. Nell'alloc sono state trasferite le opzioni "no_fp_fmt_parse", necessarie per il funzionamento della libreria a livello di kernel.
- È stata effettuata una pulizia del codice per rimuovere possibili avvertimenti del compilatore durante la compilazione del kernel con l'opzione CONFIG_WERROR. Nella compilazione del codice in Rust sono state incluse modalità diagnostiche aggiuntive e avvertimenti del linter Clippy.
- Sono state proposte astrattizzazioni per l'uso nel codice Rust di blocchi seqlock (sequence locks), callback per la gestione dell'alimentazione, I/O Memory (readX/writeX), gestori di interruzione e thread, GPIO, accesso a dispositivi, driver e credenziali.
- Sono stati ampliati gli strumenti per lo sviluppo di driver attraverso l'uso di mutex spostabili, iteratori bit, wrapper semplificati sui puntatori, diagnostica migliorata per guasti e un'infrastruttura indipendente dal bus dati.
- È stato 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 nella libreria alloc standard è stato rimosso e non è disponibile nel codice eseguito a livello di kernel (per la libreria stessa sono state preparate opzioni per disabilitare questi tipi).
- È stata aggiunta alle patch una variante del driver PL061 GPIO, riscritta in Rust. La particolare caratteristica del driver è che la sua implementazione ripete quasi riga per riga l'attuale driver GPIO in C. Per gli sviluppatori interessati a conoscere la creazione di driver in Rust, è stata preparata un'analisi riga per riga, che consente di comprendere in quali costrutti in Rust è stato trasformato il codice C.
- Nella base di codice principale di Rust è stata accettata la rustc_codegen_gcc, un backend rustc per GCC, che realizza la possibilità di compilazione anticipata (AOT) utilizzando la libreria libgccjit. Con il giusto sviluppo del backend, sarà possibile compilare il codice Rust utilizzato nel kernel mediante GCC.
- Oltre alle aziende ARM, Google e Microsoft, anche Red Hat ha espresso interesse per l'uso del linguaggio Rust nel kernel Linux. Ricordiamo che Google supporta direttamente il progetto Rust for Linux, sviluppando una nuova implementazione del meccanismo di comunicazione interprocessuale Binder in Rust e considerando la possibilità di riscrivere vari driver in Rust. Microsoft ha avviato la realizzazione di 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
