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

Miguel Ojeda, autore del progetto Rust-for-Linux, ha proposto agli sviluppatori del kernel Linux di considerare il rilascio della versione v8 dei componenti per lo sviluppo di driver per dispositivi in linguaggio Rust. Questa è una revisione dei patch tenendo conto della prima versione, pubblicata senza numero di versione. Il supporto per Rust è considerato sperimentale, ma è già incluso nel ramo linux-next, aspirando a un'integrazione nella versione autunnale 5.20/6.0 ed è sufficientemente sviluppato per iniziare a lavorare sulla creazione di strati di astrazione sopra le sottosistemi del kernel, così come per la scrittura di driver e moduli. Lo sviluppo è finanziato da Google e dall'organizzazione ISRG (Internet Security Research Group), che è fondatore del progetto Let’s Encrypt e sostiene la promozione di HTTPS e lo sviluppo di tecnologie per aumentare la sicurezza di Internet.

Nella nuova versione:

  • Gli strumenti e la variante 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, negli strumenti Rust è stata stabilizzata la supporto alla funzionalità const_fn_trait_bound, utilizzata nei patch del kernel.
  • Il codice delle binding è stato separato in un pacchetto crate «bindings», semplificando la ricompilazione in caso di modifiche solo al pacchetto principale «kernel».
  • L'implementazione del macro «concat_idents!» è stata riscritta in forma di macro procedurale, non legata alla funzionalità concat_idents e che consente l'uso di riferimenti a variabili locali.
  • La macro «static_assert!» è stata riscritta, consentendo l'uso di «core::assert!()» in qualsiasi contesto anziché solo con costanti.
  • La macro «build_error!» è stata adattata per funzionare con i moduli in modalità «RUST_BUILD_ASSERT_{WARN,ALLOW}».
  • È stato aggiunto un file separato con le impostazioni «kernel/configs/rust.config».
  • I file «*.i» elaborati nelle macro sostitutive sono stati rinominati in «*.rsi».
  • È stata interrotta la supporto per la compilazione dei componenti Rust con livelli di ottimizzazione diversi da quelli applicati al codice C.
  • È stato aggiunto un modulo fs, che fornisce binding 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 lavorare con le code di sistema (fornisce binding sulle strutture del kernel work_struct e workqueue_struct).
  • È proseguito lo sviluppo del modulo kasync con l'implementazione dei metodi di programmazione asincrona (async). È stato aggiunto un esempio di un server TCP funzionante a livello di kernel, scritto in Rust.
  • È stata aggiunta la possibilità di gestire le interruzioni in Rust tramite i trait [Threaded]Handler e i tipi [Threaded]Registration.
  • È stato aggiunto il macro procedurale «#[vtable]», che semplifica il lavoro con le tabelle di puntatori a funzioni, come la struttura file_operations.
  • È stata aggiunta l'implementazione delle liste collegate bidirezionali «unsafe_list::List».
  • È stata aggiunta una prima supporto per RCU (Read-copy-update) e il tipo Guard per controllare il legame della lock in lettura con il thread corrente.
  • È stata aggiunta la funzione Task::spawn() per creare e avviare automaticamente i thread del kernel. È stato inoltre aggiunto il metodo Task::wake_up().
  • È stato aggiunto il modulo delay, che consente di utilizzare ritardi (una bolla sopra msleep()).

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 l'inclusione di Rust tra le dipendenze di build obbligatorie del kernel. L'uso di Rust per lo sviluppo di driver consentirà di creare facilmente driver sicuri e di qualità superiore, privi di problemi come accessi alla memoria dopo il rilascio, dereferenziazione di puntatori nulli e overflow di 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.

Fonte: opennet.ru

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