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

Miguel Ojeda, autore del progetto Rust-for-Linux, ha proposto il rilascio di componenti v8 per lo sviluppo di driver di dispositivo nel linguaggio Rust affinché vengano presi in considerazione dagli sviluppatori del kernel Linux. Questa è la versione rivista delle patch, tenendo conto della prima versione, pubblicata senza numero di versione. Il supporto di Rust è considerato sperimentale, ma è già incluso nel ramo linux-next, dichiara di essere integrato nella versione autunnale 5.20/6.0 ed è abbastanza maturo per iniziare a lavorare sulla creazione di livelli di astrazione sui sottosistemi del kernel, nonché sulla scrittura dei driver. e moduli. 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.

Nella nuova versione:

  • Il toolkit e una variante della libreria alloc, priva della possibile generazione di uno stato di "panico" quando si verificano errori, sono stati aggiornati per il rilascio di Rust 1.62. Rispetto alla versione utilizzata in precedenza, il toolkit Rust ha stabilizzato il supporto per la funzionalità const_fn_trait_bound utilizzata nelle patch del kernel.
  • Il codice di collegamento è separato in un pacchetto separato "binding", che semplifica la ricostruzione se vengono apportate modifiche solo al pacchetto principale "kernel".
  • Implementazione della macro “concat_idents!” riscritto sotto forma di macro procedurale che non è legata alla funzionalità concat_idents e consente l'uso di riferimenti a variabili locali.
  • La macro “static_assert!” è stata riscritta, consentendo l'uso di “core::assert!()” in qualsiasi contesto invece delle costanti.
  • Macro "build_error!" adattato per funzionare quando la modalità "RUST_BUILD_ASSERT_{WARN,ALLOW}" è impostata per i moduli.
  • Aggiunto un file separato con le impostazioni “kernel/configs/rust.config”.
  • I file “*.i” elaborati nelle sostituzioni macro sono stati rinominati in “*.rsi”.
  • Il supporto per la creazione di componenti Rust con livelli di ottimizzazione diversi da quelli utilizzati per il codice C è stato interrotto.
  • Aggiunto modulo fs, che fornisce collegamenti per lavorare con i file system. Viene fornito un esempio di un semplice file system scritto in Rust.
  • Aggiunto modulo workqueue per lavorare con le code di sistema (fornisce collegamenti alle strutture del kernel work_struct e workqueue_struct).
  • Lo sviluppo del modulo kasync è proseguito con l'implementazione di metodi di programmazione asincrona (async). Aggiunto un esempio di server TCP di livello core scritto in Rust.
  • Aggiunta la possibilità di gestire gli interrupt nel linguaggio Rust utilizzando i tipi [Threaded]Handler e i tipi [Threaded]Registration`.
  • Aggiunta la macro procedurale "#[vtable]" per facilitare il lavoro con tabelle di puntatori a funzioni, come la struttura file_operazioni.
  • Aggiunta l'implementazione degli elenchi collegati bidirezionali "unsafe_list::List".
  • Aggiunto supporto iniziale per RCU (Read-copy-update) e tipo Guard per verificare se un blocco di lettura è associato al thread corrente.
  • Aggiunta la funzione Task::spawn() per creare e avviare automaticamente i thread del kernel. Aggiunto anche il metodo Task::wake_up().
  • Aggiunto un modulo di ritardo che ti consente di utilizzare i ritardi (un wrapper su msleep()).

Le modifiche proposte rendono possibile l'utilizzo di 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.

Fonte: opennet.ru

Aggiungi un commento