L'ottava versione delle patch del kernel Linux con supporto per il linguaggio Rust

Miguel Ojeda, autore del progetto Rust-for-Linux, ha proposto per la considerazione degli sviluppatori del kernel Linux il rilascio della v8 dei componenti per lo sviluppo di driver di dispositivi in Rust. Questa è una revisione delle patch tenendo conto della prima versione, pubblicata senza numero di versione. Il supporto per Rust è considerato sperimentale, ma è già incluso nel ramo linux-next, ambendo a essere integrato nel rilascio autunnale 5.20/6.0 e abbastanza sviluppato per iniziare a creare strati di astrazione sulle sottosistemi del kernel, oltre alla 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 HTTPS e lo sviluppo di tecnologie per migliorare la sicurezza di internet.

Nella nuova versione:

  • L'insieme di strumenti e la versione della libreria alloc, privi di possibili generazioni di stato 'panic' in caso di errori, sono stati aggiornati alla versione Rust 1.62. Rispetto alla versione precedentemente utilizzata, l'insieme di strumenti Rust ha stabilizzato il supporto per la funzionalità const_fn_trait_bound, utilizzata nelle patch al kernel.
  • Il codice di binding è stato estratto in un pacchetto crate separato chiamato «bindings», semplificando la ricompilazione in caso di modifiche al pacchetto principale «kernel».
  • L'implementazione del macro «concat_idents!» è stata riscritta come macro procedurale, non legata alla funzionalità di concat_idents e che consente l'uso di riferimenti a variabili locali.
  • Il macro «static_assert!» è stato riscritto, permettendo di utilizzare «core::assert!()» in qualsiasi contesto invece che con le costanti.
  • Il macro «build_error!» è stato adattato per funzionare quando le modalità «RUST_BUILD_ASSERT_{WARN,ALLOW}» sono attivate per i moduli.
  • È stato aggiunto un file di configurazione separato «kernel/configs/rust.config».
  • I file trattati nelle macro di sostituzione «*.i» sono stati rinominati in «*.rsi».
  • È stata interrotta la supporto alla compilazione dei componenti Rust con livelli di ottimizzazione diversi da quelli utilizzati per il codice in linguaggio C.
  • È stato aggiunto un modulo fs che fornisce un'interfaccia per lavorare con i file system. È stato proposto un esempio di un semplice file system scritto in linguaggio Rust.
  • È stato aggiunto un modulo workqueue per la gestione delle code di sistema (fornisce un'interfaccia sopra le strutture di kernel work_struct e workqueue_struct).
  • Proseguito lo sviluppo del modulo kasync con l'implementazione di metodi di programmazione asincrona (async). Aggiunto un esempio di server TCP funzionante a livello di kernel, scritto in Rust.
  • Aggiunta la possibilità di gestire le interruzioni nel linguaggio Rust tramite i trait [Threaded]Handler e i tipi [Threaded]Registration.
  • Aggiunto il macro procedurale «#[vtable]», che semplifica il lavoro con le tabelle di puntatori a funzioni, come la struttura file_operations.
  • Implementata una lista doppiamente collegata «unsafe_list::List».
  • Aggiunto il supporto iniziale per RCU (Read-copy-update) e il tipo Guard per verificare l'associazione del blocco in lettura al thread attuale.
  • Aggiunta la funzione Task::spawn() per creare e avviare automaticamente i thread del kernel. Aggiunto anche il metodo Task::wake_up().
  • Aggiunto il modulo delay, che consente di utilizzare ritardi (wrapper su msleep()).

Le modifiche proposte consentono di utilizzare Rust come secondo linguaggio per lo sviluppo di driver e moduli del kernel. Il supporto per Rust viene presentato come un'opzione, non attivata di default e non comporta l'inclusione di Rust tra le dipendenze di compilazione obbligatorie del kernel. L'uso di Rust per lo sviluppo di driver permetterà di creare driver sicuri e di qualità superiore con sforzi minimi, eliminando problemi come l'accesso a aree di memoria dopo il loro rilascio, la dereferenziazione 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

Acquista hosting affidabile per siti web con protezione DDoS, server VPS VDS 🔥 Acquista hosting affidabile per siti web con protezione DDoS, server VPS VDS | ProHoster