Terza edizione di patch per il kernel Linux con supporto per il linguaggio Rust

Miguel Ojeda, autore del progetto Rust-for-Linux, ha proposto una terza opzione di componente per lo sviluppo di driver di dispositivo nel linguaggio Rust da prendere in considerazione dagli sviluppatori del kernel Linux. Il supporto a Rust è considerato sperimentale, ma è già stato concordato di includerlo nel ramo linux-next. Lo sviluppo è finanziato da Google e dall'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 su Internet.

Ricordiamo che le modifiche proposte rendono possibile utilizzare Rust come secondo linguaggio per lo sviluppo di driver e moduli del kernel. Il supporto Rust è presentato come un'opzione che non è abilitata per impostazione predefinita e non comporta l'inclusione di Rust come dipendenza di compilazione richiesta per il kernel. Usare Rust per lo sviluppo dei driver ti consentirà di creare driver più sicuri e migliori con il minimo sforzo, esenti da problemi come l'accesso alla memoria dopo la liberazione, i riferimenti a puntatori nulli e i sovraccarichi del buffer.

La gestione sicura della memoria viene fornita in Rust in fase di compilazione attraverso il controllo dei riferimenti, tenendo traccia della proprietà dell'oggetto e della durata dell'oggetto (ambito), nonché attraverso la valutazione della correttezza dell'accesso alla memoria durante l'esecuzione del codice. Rust fornisce anche protezione contro gli overflow di numeri interi, 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 per impostazione predefinita, offre una forte tipizzazione statica per ridurre al minimo gli errori logici.

La nuova versione delle patch continua ad eliminare i commenti fatti durante la discussione sulla prima e sulla seconda versione delle patch. I cambiamenti più evidenti:

  • È stata effettuata una transizione all'utilizzo della versione stabile di Rust 1.57 come compilatore di riferimento ed è stato fornito un collegamento all'edizione stabilizzata del linguaggio Rust 2021. In precedenza, le patch erano legate al ramo beta di Rust e utilizzavano alcune funzionalità del linguaggio che sono stati classificati come instabili. La transizione alla specifica Rust 2021 ci ha permesso di iniziare a lavorare per evitare l'uso di funzionalità instabili nelle patch come const_fn_transmute, const_panic, const_unavailable_unchecked e core_panic e try_reserve.
  • È continuato lo sviluppo della versione alloc della libreria Rust inclusa nelle patch, modificata per liberare le funzioni di allocazione della memoria dalla possibile generazione dello stato di “panico” quando si verificano errori, come memoria esaurita. La nuova versione implementa le opzioni “no_rc” e “no_sync” per disabilitare funzionalità non utilizzate nel codice Rust del kernel, rendendo la libreria più modulare. Prosegue il lavoro con i principali sviluppatori alloc, finalizzato a trasferire le modifiche necessarie per il kernel nella libreria principale. L'opzione “no_fp_fmt_parse”, necessaria affinché la libreria funzioni a livello di kernel, è stata spostata nella libreria base di Rust (core).
  • Il codice è stato ripulito per eliminare possibili avvisi del compilatore durante la compilazione del kernel in modalità CONFIG_WERROR. Quando si crea codice in Rust, vengono abilitate modalità diagnostiche aggiuntive del compilatore e avvisi di linter Clippy.
  • Vengono proposte astrazioni da utilizzare nel codice Rust per seqlock (blocchi di sequenza), chiamate di callback per la gestione dell'alimentazione, memoria I/O (readX/writeX), gestori di interrupt e thread, GPIO, accesso a dispositivi, driver e credenziali.
  • Gli strumenti per lo sviluppo dei driver sono stati ampliati per includere mutex rilocabili, iteratori di bit, associazioni di puntatori semplificate, diagnostica degli errori migliorata e infrastruttura indipendente dal bus dati.
  • Lavoro migliorato con i collegamenti utilizzando un tipo Ref semplificato, basato sul backend refcount_t, che utilizza l'API del kernel con lo stesso nome per il conteggio dei riferimenti. Il supporto per i tipi Arc e Rc forniti nella libreria alloc standard è stato rimosso e non è disponibile nel codice eseguito a livello di kernel (sono state preparate opzioni per la libreria stessa che disabilitano questi tipi).
  • Le patch includono una versione del driver GPIO PL061, riscritto in Rust. Una particolarità del driver è che la sua implementazione quasi riga per riga ripete il driver GPIO esistente in linguaggio C. Per gli sviluppatori che vogliono familiarizzare con la creazione di driver in Rust, è stato preparato un confronto riga per riga che consente loro di capire in quali costrutti in Rust viene convertito il codice C.
  • La base di codice principale di Rust ha adottato rugginec_codegen_gcc, un backend rugginec per GCC che implementa la compilazione anticipata (AOT) utilizzando la libreria libgccjit. Con un corretto sviluppo del backend, ti consentirà di raccogliere il codice Rust coinvolto nel kernel utilizzando GCC.
  • Oltre ad ARM, Google e Microsoft, Red Hat ha espresso interesse nell'utilizzo del linguaggio Rust nel kernel Linux. Ricordiamo che Google fornisce direttamente supporto al progetto Rust per Linux, sta sviluppando una nuova implementazione del meccanismo di comunicazione interprocesso Binder in Rust e sta valutando la possibilità di rielaborare vari driver in Rust. Microsoft ha iniziato a implementare i driver per Hyper-V in Rust. ARM sta lavorando per migliorare il supporto Rust per i sistemi basati su ARM. IBM ha implementato il supporto Rust nel kernel per i sistemi PowerPC.

Fonte: opennet.ru

Aggiungi un commento