Miguel Ojeda, autore del progetto Rust-for-Linux, ha proposto per la considerazione degli sviluppatori del kernel Linux la quinta versione dei componenti per lo sviluppo di driver per dispositivi in linguaggio Rust. Il supporto per Rust è considerato sperimentale, ma è già incluso nel ramo linux-next ed è sufficientemente sviluppato per iniziare a lavorare su livelli di astrazione sopra i sottosistemi del kernel, nonché per la scrittura di 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 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, è continuata l'eliminazione delle osservazioni emerse durante la discussione delle prime, seconde, terze e quarte versioni delle patch. Nella nuova versione:
- Nel sistema di integrazione continua basato sul bot 0DAY/LKP supportato da Intel è stata aggiunta una verifica dei componenti per il supporto di Rust, e sono iniziati i report di testing. È in fase di preparazione l'integrazione del supporto a Rust nel sistema di testing automatizzato KernelCI. Il testing basato su GitHub CI è stato trasferito all'uso di container.
- I moduli del kernel in Rust non richiedono più la definizione degli attributi crate "#![no_std]" e "#![feature(…)]".
- Aggiunto supporto per obiettivi di compilazione singoli (.o, .s, .ll e .i).
- Nelle raccomandazioni per la codifica sono state definite regole riguardanti la separazione dei commenti ("//") e la documentazione del codice ("///").
- Rivisitato lo script is_rust_module.sh.
- Aggiunto supporto per primitive di sincronizzazione statiche (variabili globali comuni) basate sull'implementazione di "CONFIG_CONSTRUCTORS".
- Semplificata la gestione dei lock: Guard e GuardMut sono stati uniti in un unico tipo parametrizzato.
- Fornita la possibilità di definire parametri aggiuntivi durante la registrazione dei dispositivi.
- Aggiunta l'astrazione "RwSemaphore", che funge da wrapper sopra la struttura C rw_semaphore.
- Per l'utilizzo di mmap, è stato aggiunto un nuovo modulo mm e un'astrazione VMA (wrapper sulla struttura vm_area_struct).
- Il driver GPIO PL061 è stato aggiornato per utilizzare il macro «dev_*!».
- Eseguita una pulizia generale del codice.
Fonte: opennet.ru
