Šesta verzija zakrpa za Linux jezgra s podrškom za Rust

Miguel Ojeda, autor projekta Rust-for-Linux, predložio je za razmatranje od strane developera Linux jezgra izdavanje v6 komponenti za razvoj drajvera uređaja na jeziku Rust. Ovo je sedma verzija zakrpa uzimajući u obzir prvu verziju objavljenu bez broja verzije. Podrška za Rust se smatra eksperimentalnom, ali je već uključena u granu linux-next i dovoljno je razvijena za početak rada na kreiranju apstrakcijskih slojeva iznad podsistema jezgra, kao i za pisanje drajvera i modula. Razvoj finansira kompanija Google i organizacija ISRG (Internet Security Research Group), koja je osnivač projekta Let's Encrypt i doprinosi promociji HTTPS-a i razvoju tehnologija za povećanje sigurnosti interneta.

V novi različici:

  • Alat i verzija alloc biblioteke, oslobođena od mogućih generacija stanja 'panic' pri pojavi grešaka, ažurirani su na verziju Rust 1.60, u kojoj je stabilizovana podrška za režim 'maybe_uninit_extra', koji se koristi u zakrpama za jezgro.
  • Dodana je mogućnost izvođenja testova iz dokumentacije (testovi koji se koriste kao primeri u dokumentaciji), putem transformacije tokom kompajliranja testova povezanih s API-jem jezgra u KUnit testove koji se izvršavaju tokom pokretanja jezgra.
  • Usvojeni su zahtevi prema kojima testovi ne smeju da izazivaju upozorenje linterskog alata Clippy, kao ni kod za jezgro na jeziku Rust.
  • Predložena je inicijalna implementacija 'net' modula sa mrežnim funkcijama. Za kod napisan na jeziku Rust obezbeđen je pristup mrežnim strukturama jezgra kao što su 'Namespace' (na bazi strukture jezgra 'struct net'), SkBuff (struct sk_buff), TcpListener, TcpStream (struct socket), Ipv4Addr (struct in_addr), SocketAddrV4 (struct sockaddr_in) i njihovim ekvivalentima za IPv6.
  • Implementirana je inicijalna podrška za asinkrone metode programiranja (async), ostvarena u formi kasync modula. Na primer, moguće je kreirati asinkroni kod za manipulaciju TCP socket-ima: 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?; } }
  • Dodan je modul net::filter za manipulaciju filterima mrežnih paketa. Dodan je primer rust_netfilter.rs sa implementacijom filtera na jeziku Rust.
  • Dodana je implementacija jednostavnog mutex-a smutex::Mutex koji ne zahtijeva pridruživanje (pinning).
  • Dodana je blokada NoWaitLock, koja nikada ne uzrokuje čekanje na oslobađanje, a u slučaju da je zauzeta od strane drugog threada, daje grešku prilikom pokušaja dobivanja blokade umjesto da zaustavi pozivaoca.
  • Dodana je blokada RawSpinLock identificirana s raw_spinlock_t u kernelu, primjenjuje se na sekcije koje ne mogu biti u stanju čekanja.
  • Dodan je tip ARef za reference na objekat, kojem se primjenjuje mehanizam prebrojavanja referenci (always-refcounted).
  • U back-endu rustc_codegen_gcc, koji omogućava korištenje biblioteke libgccjit iz GCC projekta kao generatora koda u rustc kako bi se osigurala podrška za dostupne arhitekture i optimizacije u GCC-u, realizovana je mogućnost bootstrapping-a rustc kompajlera. Bootstrapping kompajlera podrazumijeva mogućnost korištenja GCC baziranog generatora koda u rustc za izgradnju samog rustc kompajlera. Osim toga, nedavni izdanak GCC-a 12.1 uključuje ispravke u libgccjit-u potrebne za ispravan rad rustc_codegen_gcc. Pripreme su u toku za omogućavanje instalacije rustc_codegen_gcc putem alata rustup.
  • Zabilježen je napredak u razvoju GCC front-enda gccrs s implementacijom Rust kompajlera na bazi GCC-a. Trenutno na gccrs-u radi dva programera u režimu punog rada.

Spomnimo, da predlagane spremembe omogočajo uporabo Rust kot drugega jezika za razvoj gonilnikov in modulov jedra. Podpora za Rust se predstavlja kot opcija, ki ni privzeto aktivirana in ne vodi do vključitve Rust med obvezne odvisnosti za sestavljanje jedra. Uporaba Rust za razvoj gonilnikov bo omogočila ustvarjanje varnih in kakovostnejših gonilnikov z minimalnim trudom, brez težav, kot so dostop do pomnilnika po njegovi osvoboditvi, dereferenciranje nulskih kazalcev in prečkanje meja pomnilnika.

V Rustu se varna obravnava pomnilnika zagotavlja med prevajanjem z verificiranjem sklicev, sledenjem lastništvu objektov in upoštevanjem življenjske dobe objektov (območja vidnosti), prav tako pa tudi z ocenjevanjem pravilnosti dostopa do pomnilnika med izvajanjem kode. Rust prav tako ponuja sredstva za zaščito pred prenasičenjem celoštevila, zahteva obvezno inicializacijo vrednosti spremenljivk pred uporabo, bolje obravnava napake v standardni knjižnici, uporablja koncept neprenosljivosti (immutable) sklicev in spremenljivk privzeto ter ponuja močno statično tipizacijo za minimizacijo logičnih napak.

Izvor: opennet.ru

Kupite zanesljivo gostovanje za spletne strani z zaščito pred DDoS, VPS VDS strežniki 🔥 Kupite zanesljivo gostovanje za spletne strani z zaščito pred DDoS, VPS VDS strežniki | ProHoster