Šiesta verzia záplat pre jadro Linuxu s podporou jazyka Rust

Miguel Ojeda, autor projektu Rust-for-Linux, navrhol vydanie komponentov v6 pre vývoj ovládačov zariadení v jazyku Rust na posúdenie vývojárom jadra Linuxu. Toto je siedme vydanie záplat, berúc do úvahy prvú verziu, publikovanú bez čísla verzie. Podpora hrdze sa považuje za experimentálnu, ale je už zahrnutá vo vetve linux-next a je dostatočne vyvinutá na to, aby mohla začať pracovať na vytváraní abstraktných vrstiev nad subsystémami jadra, ako aj na písaní ovládačov a modulov. Vývoj je financovaný spoločnosťou Google a ISRG (Internet Security Research Group), ktorá je zakladateľom projektu Let’s Encrypt a propaguje HTTPS a vývoj technológií na zlepšenie bezpečnosti internetu.

V novej verzii:

  • Sada nástrojov a variant knižnice alloc, zbavený možného generovania „panického“ stavu, keď sa vyskytnú chyby, boli aktualizované na vydanie Rust 1.60, ktoré stabilizuje podporu pre režim „možná_uninit_extra“ používaný v záplatách jadra.
  • Pridaná možnosť spúšťať testy z dokumentácie (testy, ktoré sa tiež používajú ako príklady v dokumentácii) prostredníctvom konverzie testov viazaných na kernel API v čase kompilácie na testy KUnit vykonávané počas načítavania jadra.
  • Boli prijaté požiadavky, aby testy neviedli k varovaniu Clippy linter, rovnako ako kód jadra Rust.
  • Navrhuje sa počiatočná implementácia modulu „net“ so sieťovými funkciami. Rust kód má prístup k sieťovým štruktúram jadra, ako je Namespace (na základe štruktúry jadra struct net), SkBuff (struct sk_buff), TcpListener, TcpStream (struct socket), Ipv4Addr (struct in_addr), SocketAddrV4 (struct sockaddr_in) a ich ekvivalenty IPv6 .
  • Počiatočná podpora pre techniky asynchrónneho programovania (async), implementovaná vo forme modulu kasync. Môžete napríklad napísať asynchrónny kód na manipuláciu so soketmi TCP: async fn echo_server(stream: TcpStream) -> Result { let mut buf = [0u8; 1024]; loop { nech n = stream.read(&mut buf).wait?; if n == 0 { return Ok(()); } stream.write_all(&buf[..n]).wait?; } }
  • Pridaný net::filter modul pre manipuláciu s filtrami sieťových paketov. Pridaný príklad rust_netfilter.rs s implementáciou filtra v jazyku Rust.
  • Pridaná implementácia jednoduchého mutexu smutex::Mutex, ktorý nevyžaduje pripnutie.
  • Pridaný NoWaitLock, ktorý nikdy nečaká na uzamknutie a ak je obsadený iným vláknom, spôsobí hlásenie chyby pri pokuse o získanie zámku namiesto zastavenia volajúceho.
  • Pridaný RawSpinLock, identifikovaný raw_spinlock_t v jadre, aplikovaný na sekcie, ktoré nemôžu byť nečinné.
  • Pridaný typ Aref pre referencie na objekt, na ktorý sa aplikuje mechanizmus počítania referencií (vždy refcounted).
  • Backend rustc_codegen_gcc, ktorý vám umožňuje použiť knižnicu libgccjit z projektu GCC ako generátor kódu v rustc na poskytovanie podpory pre architektúry a optimalizácie dostupné v GCC pre rustc, implementoval možnosť bootstrapping kompilátora rustc. Propagácia kompilátora znamená možnosť použiť generátor kódu založený na GCC v rustc na zostavenie samotného kompilátora rustc. Nedávne vydanie GCC 12.1 navyše obsahuje opravy knižnice libgccjit potrebné na správne fungovanie rustc_codegen_gcc. Prebiehajú prípravy na poskytnutie možnosti nainštalovať rustc_codegen_gcc pomocou utility rustup.
  • Zaznamenal sa pokrok vo vývoji frontendu GCC gccrs s implementáciou kompilátora jazyka Rust založeného na GCC. V súčasnosti na gccrs pracujú dvaja vývojári na plný úväzok.

Pripomeňme, že navrhované zmeny umožňujú použiť Rust ako druhý jazyk na vývoj ovládačov a modulov jadra. Podpora Rust je prezentovaná ako možnosť, ktorá nie je štandardne povolená a nevedie k tomu, že Rust je zahrnutý ako požadovaná závislosť zostavenia pre jadro. Použitie Rustu na vývoj ovládačov vám umožní vytvárať bezpečnejšie a lepšie ovládače s minimálnym úsilím, bez problémov, ako je prístup k pamäti po uvoľnení, dereferences nulového ukazovateľa a pretečenie vyrovnávacej pamäte.

Bezpečná manipulácia s pamäťou je v Rust zabezpečená v čase kompilácie prostredníctvom kontroly referencií, sledovania vlastníctva objektu a životnosti objektu (rozsahu), ako aj prostredníctvom hodnotenia správnosti prístupu do pamäte počas vykonávania kódu. Rust tiež poskytuje ochranu proti pretečeniu celých čísel, vyžaduje povinnú inicializáciu hodnôt premenných pred použitím, lepšie zvláda chyby v štandardnej knižnici, štandardne aplikuje koncept nemenných referencií a premenných, ponúka silné statické typovanie na minimalizáciu logických chýb.

Zdroj: opennet.ru

Pridať komentár