Sesta 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 v6 dei componenti per la sviluppo di driver di dispositivi nel linguaggio Rust. Questa è la settima edizione delle patch, tenendo conto della prima versione pubblicata senza numero di versione. Il supporto per Rust è considerato sperimentale, ma è già stato incluso nel ramo linux-next ed è abbastanza sviluppato per iniziare a lavorare sulla creazione di strati di astrazione sopra le 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 è la fondatrice del progetto Let’s Encrypt e promuove l'HTTPS e lo sviluppo di tecnologie per migliorare la sicurezza di Internet.

Nella nuova versione:

  • Gli 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.60, in cui è stata stabilizzata la supporto per la modalità "maybe_uninit_extra", utilizzata nelle patch per il kernel.
  • È stata aggiunta la possibilità di eseguire test dalla documentazione (test che sono anche utilizzati come esempi nella documentazione), attraverso la trasformazione durante la compilazione dei test legati all'API del kernel, in test KUnit, eseguiti durante il caricamento del kernel.
  • Sono state approvate le richieste secondo cui i test non devono generare avvertimenti dal linter Clippy, così come il codice per il kernel in Rust.
  • È stata proposta un'implementazione iniziale del modulo "net" con funzionalità di rete. Per il codice in Rust è stato fornito l'accesso a strutture di rete del kernel, come "Namespace" (basato sulla struttura del kernel "struct net"), SkBuff (struct sk_buff), TcpListener, TcpStream (struct socket), Ipv4Addr (struct in_addr), SocketAddrV4 (struct sockaddr_in) e i loro equivalenti per IPv6.
  • È stato implementato il supporto iniziale per i metodi di programmazione asincrona (async), realizzato sotto forma di modulo kasync. Ad esempio, è possibile creare codice funzionante in modalità asincrona per la manipolazione con i socket TCP: async fn echo_server(stream: TcpStream) -> Result { let mut buf = [0u8; 1024]; loop { let n = stream.read(&mut buf).await?; if n == 0 { return Ok(()); } stream.write_all(&buf[..n]).await?; } }
  • È stato aggiunto il modulo net::filter per la manipolazione dei filtri dei pacchetti di rete. È stato aggiunto un esempio rust_netfilter.rs con l'implementazione di un filtro in Rust.
  • È stata aggiunta l'implementazione di un mutex semplice smutex::Mutex, che non richiede il pinning.
  • È stato aggiunto il blocco NoWaitLock, che non comporta mai l'attesa per il rilascio, e in caso di occupazione da parte di un altro thread si traduce in un errore durante il tentativo di acquisire il blocco invece di fermare il chiamante.
  • È stato aggiunto il blocco RawSpinLock, identificato con raw_spinlock_t nel kernel, utilizzato in sezioni che non possono trovarsi in stato di attesa.
  • È stato aggiunto il tipo ARef per i riferimenti a oggetti a cui si applica il meccanismo di conteggio dei riferimenti (sempre conteggiati).
  • Nel backend rustc_codegen_gcc, che consente di utilizzare la libreria libgccjit del progetto GCC come generatore di codice per rustc al fine di fornire a rustc supporto per architetture e ottimizzazioni disponibili in GCC, è stata implementata la possibilità di bootstrapping del compilatore rustc. Con bootstrapping del compilatore si intende la possibilità di utilizzare in rustc un generatore di codice basato su GCC per costruire lo stesso compilatore rustc. Inoltre, nella recente versione di GCC 12.1 sono state incluse correzioni in libgccjit necessarie per il corretto funzionamento di rustc_codegen_gcc. Si sta preparando la possibilità di installare rustc_codegen_gcc tramite l'utilità rustup.
  • Si registra un progresso nello sviluppo del frontend GCC gccrs, con l'implementazione di un compilatore del linguaggio Rust basato su GCC. Attualmente, due sviluppatori stanno lavorando su gccrs in modalità di pieno svago.

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 porta all'inclusione di Rust tra le dipendenze di compilazione obbligatorie per il kernel. L'uso di Rust per lo sviluppo di driver permetterà di creare driver sicuri e di qualità superiore con il minimo sforzo, eliminando problemi come l'accesso alla memoria dopo che è stata liberata, la dereferenza di puntatori nulli e il superamento dei limiti del 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