Miguel Ojeda, autore del progetto Rust-for-Linux, ha proposto ai programmatori del kernel Linux un quarto set di componenti per lo sviluppo di driver di dispositivi in linguaggio Rust. Il supporto per Rust è considerato sperimentale, ma è già stato concordato per l'inclusione nel ramo linux-next ed è sufficientemente sviluppato per iniziare a creare strati di astrazione sopra i sottosistemi del kernel, oltre che per la scrittura di driver e moduli. Lo sviluppo è finanziato da Google e dall'organizzazione ISRG (Internet Security Research Group), che è la fondatrice del progetto Let’s Encrypt e promuove l'adozione di HTTPS e lo 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 è proseguita la rimozione delle osservazioni espresse durante la discussione della prima, seconda e terza edizione delle patch. Nella nuova versione:
- È stato effettuato il passaggio all'uso come compilatore di riferimento della versione stabile di Rust 1.58.0. Tra le modifiche necessarie per il progetto, che non sono ancora incluse nell'insieme principale degli strumenti di Rust, si segnalano il flag «-Zsymbol-mangling-version=v0» (in attesa nella versione Rust 1.59.0) e la modalità «maybe_uninit_extra» (in attesa nella versione Rust 1.60.0).
- Aggiunte verifiche automatiche per la disponibilità degli strumenti Rust e ampliate le capacità di test per il supporto di Rust nel sistema.
- Introdotte nuove astrazioni per accedere, dal codice Rust, a tabelle di identificazione dei dispositivi ("IdArray" e "IdTable").
- Aggiunti livelli intermedi per accedere a funzioni relative al timer (framework orologio).
- I driver per le piattaforme sono ora definiti tramite l'implementazione dei tratti.
- Aggiunto un nuovo macro per semplificare la registrazione dei driver di piattaforma, e proposto un nuovo modello di driver standard.
- Aggiunti macro per le strutture "dev_*".
- Aggiunti metodi "{read,write}*_relaxed" per il tipo IoMem.
- Rimosse la proprietà FileOpener per semplificare le operazioni con i file.
- Aggiunto il parametro "ThisModule" tra gli argomenti passati durante la registrazione del driver.
- Proposto un modello standard per la creazione di moduli del kernel in Rust.
Fonte: opennet.ru
